{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression as LR\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.model_selection import cross_val_score\n",
    "from sklearn.datasets import fetch_california_housing as fch #加利福尼亚房屋价值数据集\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "housevalue = fch() #会需要下载，大家可以提前运行试试看"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[   8.3252    ,   41.        ,    6.98412698, ...,    2.55555556,\n",
       "          37.88      , -122.23      ],\n",
       "       [   8.3014    ,   21.        ,    6.23813708, ...,    2.10984183,\n",
       "          37.86      , -122.22      ],\n",
       "       [   7.2574    ,   52.        ,    8.28813559, ...,    2.80225989,\n",
       "          37.85      , -122.24      ],\n",
       "       ...,\n",
       "       [   1.7       ,   17.        ,    5.20554273, ...,    2.3256351 ,\n",
       "          39.43      , -121.22      ],\n",
       "       [   1.8672    ,   18.        ,    5.32951289, ...,    2.12320917,\n",
       "          39.43      , -121.32      ],\n",
       "       [   2.3886    ,   16.        ,    5.25471698, ...,    2.61698113,\n",
       "          39.37      , -121.24      ]])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "housevalue.data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = pd.DataFrame(housevalue.data) #放入DataFrame中便于查看"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(20640, 8)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "y = housevalue.target"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.14999"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.min()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5.00001"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.max()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(20640,)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>MedInc</th>\n",
       "      <th>HouseAge</th>\n",
       "      <th>AveRooms</th>\n",
       "      <th>AveBedrms</th>\n",
       "      <th>Population</th>\n",
       "      <th>AveOccup</th>\n",
       "      <th>Latitude</th>\n",
       "      <th>Longitude</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>8.3252</td>\n",
       "      <td>41.0</td>\n",
       "      <td>6.984127</td>\n",
       "      <td>1.023810</td>\n",
       "      <td>322.0</td>\n",
       "      <td>2.555556</td>\n",
       "      <td>37.88</td>\n",
       "      <td>-122.23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8.3014</td>\n",
       "      <td>21.0</td>\n",
       "      <td>6.238137</td>\n",
       "      <td>0.971880</td>\n",
       "      <td>2401.0</td>\n",
       "      <td>2.109842</td>\n",
       "      <td>37.86</td>\n",
       "      <td>-122.22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>7.2574</td>\n",
       "      <td>52.0</td>\n",
       "      <td>8.288136</td>\n",
       "      <td>1.073446</td>\n",
       "      <td>496.0</td>\n",
       "      <td>2.802260</td>\n",
       "      <td>37.85</td>\n",
       "      <td>-122.24</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>5.6431</td>\n",
       "      <td>52.0</td>\n",
       "      <td>5.817352</td>\n",
       "      <td>1.073059</td>\n",
       "      <td>558.0</td>\n",
       "      <td>2.547945</td>\n",
       "      <td>37.85</td>\n",
       "      <td>-122.25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3.8462</td>\n",
       "      <td>52.0</td>\n",
       "      <td>6.281853</td>\n",
       "      <td>1.081081</td>\n",
       "      <td>565.0</td>\n",
       "      <td>2.181467</td>\n",
       "      <td>37.85</td>\n",
       "      <td>-122.25</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   MedInc  HouseAge  AveRooms  AveBedrms  Population  AveOccup  Latitude  \\\n",
       "0  8.3252      41.0  6.984127   1.023810       322.0  2.555556     37.88   \n",
       "1  8.3014      21.0  6.238137   0.971880      2401.0  2.109842     37.86   \n",
       "2  7.2574      52.0  8.288136   1.073446       496.0  2.802260     37.85   \n",
       "3  5.6431      52.0  5.817352   1.073059       558.0  2.547945     37.85   \n",
       "4  3.8462      52.0  6.281853   1.081081       565.0  2.181467     37.85   \n",
       "\n",
       "   Longitude  \n",
       "0    -122.23  \n",
       "1    -122.22  \n",
       "2    -122.24  \n",
       "3    -122.25  \n",
       "4    -122.25  "
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['MedInc',\n",
       " 'HouseAge',\n",
       " 'AveRooms',\n",
       " 'AveBedrms',\n",
       " 'Population',\n",
       " 'AveOccup',\n",
       " 'Latitude',\n",
       " 'Longitude']"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "housevalue.feature_names #特征名字"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "X.columns = housevalue.feature_names"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "\"\"\"\n",
    "MedInc：该街区住户的收入中位数\n",
    "HouseAge：该街区房屋使用年代的中位数\n",
    "AveRooms：该街区平均的房间数目\n",
    "AveBedrms：该街区平均的卧室数目\n",
    "Population：街区人口\n",
    "AveOccup：平均入住率\n",
    "Latitude：街区的纬度\n",
    "Longitude：街区的经度\n",
    "\"\"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,y,test_size=0.3,random_state=420)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>MedInc</th>\n",
       "      <th>HouseAge</th>\n",
       "      <th>AveRooms</th>\n",
       "      <th>AveBedrms</th>\n",
       "      <th>Population</th>\n",
       "      <th>AveOccup</th>\n",
       "      <th>Latitude</th>\n",
       "      <th>Longitude</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.7656</td>\n",
       "      <td>42.0</td>\n",
       "      <td>4.144703</td>\n",
       "      <td>1.031008</td>\n",
       "      <td>1581.0</td>\n",
       "      <td>4.085271</td>\n",
       "      <td>33.96</td>\n",
       "      <td>-118.28</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.5281</td>\n",
       "      <td>29.0</td>\n",
       "      <td>5.095890</td>\n",
       "      <td>1.095890</td>\n",
       "      <td>1137.0</td>\n",
       "      <td>3.115068</td>\n",
       "      <td>39.29</td>\n",
       "      <td>-121.68</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4.1750</td>\n",
       "      <td>14.0</td>\n",
       "      <td>5.604699</td>\n",
       "      <td>1.045965</td>\n",
       "      <td>2823.0</td>\n",
       "      <td>2.883555</td>\n",
       "      <td>37.14</td>\n",
       "      <td>-121.64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3.0278</td>\n",
       "      <td>52.0</td>\n",
       "      <td>5.172932</td>\n",
       "      <td>1.085714</td>\n",
       "      <td>1663.0</td>\n",
       "      <td>2.500752</td>\n",
       "      <td>37.78</td>\n",
       "      <td>-122.49</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4.5000</td>\n",
       "      <td>36.0</td>\n",
       "      <td>4.940447</td>\n",
       "      <td>0.982630</td>\n",
       "      <td>1306.0</td>\n",
       "      <td>3.240695</td>\n",
       "      <td>33.95</td>\n",
       "      <td>-118.09</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   MedInc  HouseAge  AveRooms  AveBedrms  Population  AveOccup  Latitude  \\\n",
       "0  1.7656      42.0  4.144703   1.031008      1581.0  4.085271     33.96   \n",
       "1  1.5281      29.0  5.095890   1.095890      1137.0  3.115068     39.29   \n",
       "2  4.1750      14.0  5.604699   1.045965      2823.0  2.883555     37.14   \n",
       "3  3.0278      52.0  5.172932   1.085714      1663.0  2.500752     37.78   \n",
       "4  4.5000      36.0  4.940447   0.982630      1306.0  3.240695     33.95   \n",
       "\n",
       "   Longitude  \n",
       "0    -118.28  \n",
       "1    -121.68  \n",
       "2    -121.64  \n",
       "3    -122.49  \n",
       "4    -118.09  "
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Xtest.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>MedInc</th>\n",
       "      <th>HouseAge</th>\n",
       "      <th>AveRooms</th>\n",
       "      <th>AveBedrms</th>\n",
       "      <th>Population</th>\n",
       "      <th>AveOccup</th>\n",
       "      <th>Latitude</th>\n",
       "      <th>Longitude</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>4.1776</td>\n",
       "      <td>35.0</td>\n",
       "      <td>4.425172</td>\n",
       "      <td>1.030683</td>\n",
       "      <td>5380.0</td>\n",
       "      <td>3.368817</td>\n",
       "      <td>37.48</td>\n",
       "      <td>-122.19</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>5.3261</td>\n",
       "      <td>38.0</td>\n",
       "      <td>6.267516</td>\n",
       "      <td>1.089172</td>\n",
       "      <td>429.0</td>\n",
       "      <td>2.732484</td>\n",
       "      <td>37.53</td>\n",
       "      <td>-122.30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.9439</td>\n",
       "      <td>26.0</td>\n",
       "      <td>5.768977</td>\n",
       "      <td>1.141914</td>\n",
       "      <td>891.0</td>\n",
       "      <td>2.940594</td>\n",
       "      <td>36.02</td>\n",
       "      <td>-119.08</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2.5000</td>\n",
       "      <td>22.0</td>\n",
       "      <td>4.916000</td>\n",
       "      <td>1.012000</td>\n",
       "      <td>733.0</td>\n",
       "      <td>2.932000</td>\n",
       "      <td>38.57</td>\n",
       "      <td>-121.31</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3.8250</td>\n",
       "      <td>34.0</td>\n",
       "      <td>5.036765</td>\n",
       "      <td>1.098039</td>\n",
       "      <td>1134.0</td>\n",
       "      <td>2.779412</td>\n",
       "      <td>33.91</td>\n",
       "      <td>-118.35</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   MedInc  HouseAge  AveRooms  AveBedrms  Population  AveOccup  Latitude  \\\n",
       "0  4.1776      35.0  4.425172   1.030683      5380.0  3.368817     37.48   \n",
       "1  5.3261      38.0  6.267516   1.089172       429.0  2.732484     37.53   \n",
       "2  1.9439      26.0  5.768977   1.141914       891.0  2.940594     36.02   \n",
       "3  2.5000      22.0  4.916000   1.012000       733.0  2.932000     38.57   \n",
       "4  3.8250      34.0  5.036765   1.098039      1134.0  2.779412     33.91   \n",
       "\n",
       "   Longitude  \n",
       "0    -122.19  \n",
       "1    -122.30  \n",
       "2    -119.08  \n",
       "3    -121.31  \n",
       "4    -118.35  "
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Xtrain.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "#恢复索引\n",
    "for i in [Xtrain, Xtest]:\n",
    "    i.index = range(i.shape[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(14448, 8)"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Xtrain.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#如果希望进行数据标准化，还记得应该怎么做吗？\n",
    "#先用训练集训练(fit)标准化的类，然后用训练好的类分别转化(transform)训练集和测试集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [],
   "source": [
    "reg = LR().fit(Xtrain, Ytrain)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "yhat = reg.predict(Xtest) #预测我们的yhat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-0.6528439725035966"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "yhat.min()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7.146198214270875"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "yhat.max()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 4.37358931e-01,  1.02112683e-02, -1.07807216e-01,  6.26433828e-01,\n",
       "        5.21612535e-07, -3.34850965e-03, -4.13095938e-01, -4.26210954e-01])"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reg.coef_ #w,系数向量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup',\n",
       "       'Latitude', 'Longitude'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Xtrain.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('MedInc', 0.4373589305968403),\n",
       " ('HouseAge', 0.010211268294494038),\n",
       " ('AveRooms', -0.10780721617317715),\n",
       " ('AveBedrms', 0.6264338275363783),\n",
       " ('Population', 5.216125353178735e-07),\n",
       " ('AveOccup', -0.0033485096463336094),\n",
       " ('Latitude', -0.4130959378947711),\n",
       " ('Longitude', -0.4262109536208467)]"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[*zip(Xtrain.columns,reg.coef_)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'\\nMedInc：该街区住户的收入中位数\\nHouseAge：该街区房屋使用年代的中位数\\nAveRooms：该街区平均的房间数目\\nAveBedrms：该街区平均的卧室数目\\nPopulation：街区人口\\nAveOccup：平均入住率\\nLatitude：街区的纬度\\nLongitude：街区的经度\\n'"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"\"\"\n",
    "MedInc：该街区住户的收入中位数\n",
    "HouseAge：该街区房屋使用年代的中位数\n",
    "AveRooms：该街区平均的房间数目\n",
    "AveBedrms：该街区平均的卧室数目\n",
    "Population：街区人口\n",
    "AveOccup：平均入住率\n",
    "Latitude：街区的纬度\n",
    "Longitude：街区的经度\n",
    "\"\"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-36.25689322920386"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reg.intercept_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.5309012639324571"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import mean_squared_error as MSE\n",
    "MSE(yhat,Ytest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2.0819292877906976"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Ytest.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5.00001"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.max()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.14999"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.min()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "ename": "ValueError",
     "evalue": "'mean_squared_error' is not a valid scoring value. Use sorted(sklearn.metrics.SCORERS.keys()) to get valid options.",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mKeyError\u001b[0m                                  Traceback (most recent call last)",
      "\u001b[1;32mC:\\Python\\lib\\site-packages\\sklearn\\metrics\\scorer.py\u001b[0m in \u001b[0;36mget_scorer\u001b[1;34m(scoring)\u001b[0m\n\u001b[0;32m    228\u001b[0m         \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 229\u001b[1;33m             \u001b[0mscorer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mSCORERS\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mscoring\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    230\u001b[0m         \u001b[1;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mKeyError\u001b[0m: 'mean_squared_error'",
      "\nDuring handling of the above exception, another exception occurred:\n",
      "\u001b[1;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-64-b70293e87db8>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mcross_val_score\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mreg\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mX\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mcv\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mscoring\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m\"mean_squared_error\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;32mC:\\Python\\lib\\site-packages\\sklearn\\model_selection\\_validation.py\u001b[0m in \u001b[0;36mcross_val_score\u001b[1;34m(estimator, X, y, groups, scoring, cv, n_jobs, verbose, fit_params, pre_dispatch, error_score)\u001b[0m\n\u001b[0;32m    392\u001b[0m     \"\"\"\n\u001b[0;32m    393\u001b[0m     \u001b[1;31m# To ensure multimetric format is not supported\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 394\u001b[1;33m     \u001b[0mscorer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcheck_scoring\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mestimator\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mscoring\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mscoring\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    395\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    396\u001b[0m     cv_results = cross_validate(estimator=estimator, X=X, y=y, groups=groups,\n",
      "\u001b[1;32mC:\\Python\\lib\\site-packages\\sklearn\\metrics\\scorer.py\u001b[0m in \u001b[0;36mcheck_scoring\u001b[1;34m(estimator, scoring, allow_none)\u001b[0m\n\u001b[0;32m    271\u001b[0m                         \"'fit' method, %r was passed\" % estimator)\n\u001b[0;32m    272\u001b[0m     \u001b[1;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mscoring\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msix\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstring_types\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 273\u001b[1;33m         \u001b[1;32mreturn\u001b[0m \u001b[0mget_scorer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mscoring\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    274\u001b[0m     \u001b[1;32melif\u001b[0m \u001b[0mcallable\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mscoring\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    275\u001b[0m         \u001b[1;31m# Heuristic to ensure user has not passed a metric\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mC:\\Python\\lib\\site-packages\\sklearn\\metrics\\scorer.py\u001b[0m in \u001b[0;36mget_scorer\u001b[1;34m(scoring)\u001b[0m\n\u001b[0;32m    231\u001b[0m             raise ValueError('%r is not a valid scoring value. '\n\u001b[0;32m    232\u001b[0m                              \u001b[1;34m'Use sorted(sklearn.metrics.SCORERS.keys()) '\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 233\u001b[1;33m                              'to get valid options.' % (scoring))\n\u001b[0m\u001b[0;32m    234\u001b[0m     \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    235\u001b[0m         \u001b[0mscorer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mscoring\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mValueError\u001b[0m: 'mean_squared_error' is not a valid scoring value. Use sorted(sklearn.metrics.SCORERS.keys()) to get valid options."
     ]
    }
   ],
   "source": [
    "cross_val_score(reg,X,y,cv=10,scoring=\"mean_squared_error\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['accuracy',\n",
       " 'adjusted_mutual_info_score',\n",
       " 'adjusted_rand_score',\n",
       " 'average_precision',\n",
       " 'balanced_accuracy',\n",
       " 'brier_score_loss',\n",
       " 'completeness_score',\n",
       " 'explained_variance',\n",
       " 'f1',\n",
       " 'f1_macro',\n",
       " 'f1_micro',\n",
       " 'f1_samples',\n",
       " 'f1_weighted',\n",
       " 'fowlkes_mallows_score',\n",
       " 'homogeneity_score',\n",
       " 'mutual_info_score',\n",
       " 'neg_log_loss',\n",
       " 'neg_mean_absolute_error',\n",
       " 'neg_mean_squared_error',\n",
       " 'neg_mean_squared_log_error',\n",
       " 'neg_median_absolute_error',\n",
       " 'normalized_mutual_info_score',\n",
       " 'precision',\n",
       " 'precision_macro',\n",
       " 'precision_micro',\n",
       " 'precision_samples',\n",
       " 'precision_weighted',\n",
       " 'r2',\n",
       " 'recall',\n",
       " 'recall_macro',\n",
       " 'recall_micro',\n",
       " 'recall_samples',\n",
       " 'recall_weighted',\n",
       " 'roc_auc',\n",
       " 'v_measure_score']"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#为什么报错了？来试试看！\n",
    "import sklearn\n",
    "sorted(sklearn.metrics.SCORERS.keys())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-0.550952429695658"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cross_val_score(reg,X,y,cv=10,scoring=\"neg_mean_squared_error\").mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.33806537615560006"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#调用R2\n",
    "from sklearn.metrics import r2_score\n",
    "r2_score(yhat,Ytest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6043668160178817"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r2 = reg.score(Xtest,Ytest)\n",
    "r2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6043668160178817"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r2_score(Ytest,yhat)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6043668160178817"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#或者你也可以指定参数，就不必在意顺序了\n",
    "r2_score(y_true = Ytest,y_pred = yhat)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.5110068610524564"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cross_val_score(reg,X,y,cv=10,scoring=\"r2\").mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0.14999,\n",
       " 0.14999,\n",
       " 0.225,\n",
       " 0.325,\n",
       " 0.35,\n",
       " 0.375,\n",
       " 0.388,\n",
       " 0.392,\n",
       " 0.394,\n",
       " 0.396,\n",
       " 0.4,\n",
       " 0.404,\n",
       " 0.409,\n",
       " 0.41,\n",
       " 0.43,\n",
       " 0.435,\n",
       " 0.437,\n",
       " 0.439,\n",
       " 0.44,\n",
       " 0.44,\n",
       " 0.444,\n",
       " 0.446,\n",
       " 0.45,\n",
       " 0.45,\n",
       " 0.45,\n",
       " 0.45,\n",
       " 0.455,\n",
       " 0.455,\n",
       " 0.455,\n",
       " 0.456,\n",
       " 0.462,\n",
       " 0.463,\n",
       " 0.471,\n",
       " 0.475,\n",
       " 0.478,\n",
       " 0.478,\n",
       " 0.481,\n",
       " 0.481,\n",
       " 0.483,\n",
       " 0.483,\n",
       " 0.485,\n",
       " 0.485,\n",
       " 0.488,\n",
       " 0.489,\n",
       " 0.49,\n",
       " 0.492,\n",
       " 0.494,\n",
       " 0.494,\n",
       " 0.494,\n",
       " 0.495,\n",
       " 0.496,\n",
       " 0.5,\n",
       " 0.5,\n",
       " 0.504,\n",
       " 0.505,\n",
       " 0.506,\n",
       " 0.506,\n",
       " 0.508,\n",
       " 0.508,\n",
       " 0.51,\n",
       " 0.516,\n",
       " 0.519,\n",
       " 0.52,\n",
       " 0.521,\n",
       " 0.523,\n",
       " 0.523,\n",
       " 0.525,\n",
       " 0.525,\n",
       " 0.525,\n",
       " 0.525,\n",
       " 0.525,\n",
       " 0.527,\n",
       " 0.527,\n",
       " 0.528,\n",
       " 0.529,\n",
       " 0.53,\n",
       " 0.531,\n",
       " 0.532,\n",
       " 0.534,\n",
       " 0.535,\n",
       " 0.535,\n",
       " 0.535,\n",
       " 0.538,\n",
       " 0.538,\n",
       " 0.539,\n",
       " 0.539,\n",
       " 0.539,\n",
       " 0.541,\n",
       " 0.541,\n",
       " 0.542,\n",
       " 0.542,\n",
       " 0.542,\n",
       " 0.543,\n",
       " 0.543,\n",
       " 0.544,\n",
       " 0.544,\n",
       " 0.546,\n",
       " 0.547,\n",
       " 0.55,\n",
       " 0.55,\n",
       " 0.55,\n",
       " 0.55,\n",
       " 0.55,\n",
       " 0.55,\n",
       " 0.55,\n",
       " 0.55,\n",
       " 0.551,\n",
       " 0.553,\n",
       " 0.553,\n",
       " 0.553,\n",
       " 0.554,\n",
       " 0.554,\n",
       " 0.554,\n",
       " 0.555,\n",
       " 0.556,\n",
       " 0.556,\n",
       " 0.557,\n",
       " 0.558,\n",
       " 0.558,\n",
       " 0.559,\n",
       " 0.559,\n",
       " 0.559,\n",
       " 0.559,\n",
       " 0.56,\n",
       " 0.56,\n",
       " 0.562,\n",
       " 0.566,\n",
       " 0.567,\n",
       " 0.567,\n",
       " 0.567,\n",
       " 0.567,\n",
       " 0.567,\n",
       " 0.568,\n",
       " 0.57,\n",
       " 0.571,\n",
       " 0.572,\n",
       " 0.574,\n",
       " 0.574,\n",
       " 0.575,\n",
       " 0.575,\n",
       " 0.575,\n",
       " 0.575,\n",
       " 0.576,\n",
       " 0.577,\n",
       " 0.577,\n",
       " 0.577,\n",
       " 0.578,\n",
       " 0.579,\n",
       " 0.579,\n",
       " 0.579,\n",
       " 0.58,\n",
       " 0.58,\n",
       " 0.58,\n",
       " 0.58,\n",
       " 0.58,\n",
       " 0.58,\n",
       " 0.581,\n",
       " 0.581,\n",
       " 0.581,\n",
       " 0.581,\n",
       " 0.582,\n",
       " 0.583,\n",
       " 0.583,\n",
       " 0.583,\n",
       " 0.583,\n",
       " 0.584,\n",
       " 0.586,\n",
       " 0.586,\n",
       " 0.587,\n",
       " 0.588,\n",
       " 0.588,\n",
       " 0.59,\n",
       " 0.59,\n",
       " 0.59,\n",
       " 0.59,\n",
       " 0.591,\n",
       " 0.591,\n",
       " 0.593,\n",
       " 0.593,\n",
       " 0.594,\n",
       " 0.594,\n",
       " 0.594,\n",
       " 0.594,\n",
       " 0.595,\n",
       " 0.596,\n",
       " 0.596,\n",
       " 0.597,\n",
       " 0.598,\n",
       " 0.598,\n",
       " 0.6,\n",
       " 0.6,\n",
       " 0.6,\n",
       " 0.602,\n",
       " 0.602,\n",
       " 0.603,\n",
       " 0.604,\n",
       " 0.604,\n",
       " 0.604,\n",
       " 0.605,\n",
       " 0.606,\n",
       " 0.606,\n",
       " 0.608,\n",
       " 0.608,\n",
       " 0.608,\n",
       " 0.609,\n",
       " 0.609,\n",
       " 0.611,\n",
       " 0.612,\n",
       " 0.612,\n",
       " 0.613,\n",
       " 0.613,\n",
       " 0.613,\n",
       " 0.614,\n",
       " 0.615,\n",
       " 0.616,\n",
       " 0.616,\n",
       " 0.616,\n",
       " 0.616,\n",
       " 0.618,\n",
       " 0.618,\n",
       " 0.618,\n",
       " 0.619,\n",
       " 0.619,\n",
       " 0.62,\n",
       " 0.62,\n",
       " 0.62,\n",
       " 0.62,\n",
       " 0.62,\n",
       " 0.62,\n",
       " 0.62,\n",
       " 0.62,\n",
       " 0.621,\n",
       " 0.621,\n",
       " 0.621,\n",
       " 0.622,\n",
       " 0.623,\n",
       " 0.625,\n",
       " 0.625,\n",
       " 0.625,\n",
       " 0.627,\n",
       " 0.627,\n",
       " 0.628,\n",
       " 0.628,\n",
       " 0.629,\n",
       " 0.63,\n",
       " 0.63,\n",
       " 0.63,\n",
       " 0.63,\n",
       " 0.631,\n",
       " 0.631,\n",
       " 0.632,\n",
       " 0.632,\n",
       " 0.633,\n",
       " 0.633,\n",
       " 0.633,\n",
       " 0.634,\n",
       " 0.634,\n",
       " 0.635,\n",
       " 0.635,\n",
       " 0.635,\n",
       " 0.635,\n",
       " 0.635,\n",
       " 0.637,\n",
       " 0.637,\n",
       " 0.637,\n",
       " 0.637,\n",
       " 0.638,\n",
       " 0.639,\n",
       " 0.643,\n",
       " 0.644,\n",
       " 0.644,\n",
       " 0.646,\n",
       " 0.646,\n",
       " 0.646,\n",
       " 0.646,\n",
       " 0.647,\n",
       " 0.647,\n",
       " 0.647,\n",
       " 0.648,\n",
       " 0.65,\n",
       " 0.65,\n",
       " 0.65,\n",
       " 0.652,\n",
       " 0.652,\n",
       " 0.654,\n",
       " 0.654,\n",
       " 0.654,\n",
       " 0.655,\n",
       " 0.656,\n",
       " 0.656,\n",
       " 0.656,\n",
       " 0.656,\n",
       " 0.657,\n",
       " 0.658,\n",
       " 0.658,\n",
       " 0.659,\n",
       " 0.659,\n",
       " 0.659,\n",
       " 0.659,\n",
       " 0.659,\n",
       " 0.66,\n",
       " 0.661,\n",
       " 0.661,\n",
       " 0.662,\n",
       " 0.662,\n",
       " 0.663,\n",
       " 0.664,\n",
       " 0.664,\n",
       " 0.664,\n",
       " 0.668,\n",
       " 0.669,\n",
       " 0.669,\n",
       " 0.67,\n",
       " 0.67,\n",
       " 0.67,\n",
       " 0.67,\n",
       " 0.67,\n",
       " 0.67,\n",
       " 0.672,\n",
       " 0.672,\n",
       " 0.672,\n",
       " 0.673,\n",
       " 0.673,\n",
       " 0.674,\n",
       " 0.675,\n",
       " 0.675,\n",
       " 0.675,\n",
       " 0.675,\n",
       " 0.675,\n",
       " 0.675,\n",
       " 0.675,\n",
       " 0.675,\n",
       " 0.675,\n",
       " 0.675,\n",
       " 0.675,\n",
       " 0.675,\n",
       " 0.675,\n",
       " 0.676,\n",
       " 0.676,\n",
       " 0.677,\n",
       " 0.678,\n",
       " 0.68,\n",
       " 0.68,\n",
       " 0.681,\n",
       " 0.682,\n",
       " 0.682,\n",
       " 0.682,\n",
       " 0.682,\n",
       " 0.683,\n",
       " 0.683,\n",
       " 0.683,\n",
       " 0.684,\n",
       " 0.684,\n",
       " 0.685,\n",
       " 0.685,\n",
       " 0.685,\n",
       " 0.685,\n",
       " 0.686,\n",
       " 0.686,\n",
       " 0.687,\n",
       " 0.688,\n",
       " 0.689,\n",
       " 0.689,\n",
       " 0.689,\n",
       " 0.69,\n",
       " 0.69,\n",
       " 0.691,\n",
       " 0.691,\n",
       " 0.692,\n",
       " 0.693,\n",
       " 0.694,\n",
       " 0.694,\n",
       " 0.694,\n",
       " 0.694,\n",
       " 0.694,\n",
       " 0.695,\n",
       " 0.695,\n",
       " 0.695,\n",
       " 0.696,\n",
       " 0.696,\n",
       " 0.697,\n",
       " 0.698,\n",
       " 0.699,\n",
       " 0.699,\n",
       " 0.7,\n",
       " 0.7,\n",
       " 0.7,\n",
       " 0.7,\n",
       " 0.7,\n",
       " 0.7,\n",
       " 0.701,\n",
       " 0.701,\n",
       " 0.701,\n",
       " 0.702,\n",
       " 0.702,\n",
       " 0.703,\n",
       " 0.704,\n",
       " 0.704,\n",
       " 0.705,\n",
       " 0.705,\n",
       " 0.706,\n",
       " 0.707,\n",
       " 0.707,\n",
       " 0.707,\n",
       " 0.708,\n",
       " 0.709,\n",
       " 0.71,\n",
       " 0.71,\n",
       " 0.71,\n",
       " 0.711,\n",
       " 0.712,\n",
       " 0.712,\n",
       " 0.713,\n",
       " 0.713,\n",
       " 0.713,\n",
       " 0.714,\n",
       " 0.715,\n",
       " 0.716,\n",
       " 0.718,\n",
       " 0.719,\n",
       " 0.72,\n",
       " 0.72,\n",
       " 0.72,\n",
       " 0.721,\n",
       " 0.722,\n",
       " 0.723,\n",
       " 0.723,\n",
       " 0.723,\n",
       " 0.723,\n",
       " 0.723,\n",
       " 0.725,\n",
       " 0.725,\n",
       " 0.727,\n",
       " 0.727,\n",
       " 0.728,\n",
       " 0.729,\n",
       " 0.729,\n",
       " 0.73,\n",
       " 0.73,\n",
       " 0.73,\n",
       " 0.73,\n",
       " 0.73,\n",
       " 0.731,\n",
       " 0.731,\n",
       " 0.731,\n",
       " 0.731,\n",
       " 0.732,\n",
       " 0.733,\n",
       " 0.733,\n",
       " 0.734,\n",
       " 0.735,\n",
       " 0.735,\n",
       " 0.737,\n",
       " 0.738,\n",
       " 0.738,\n",
       " 0.738,\n",
       " 0.74,\n",
       " 0.74,\n",
       " 0.74,\n",
       " 0.741,\n",
       " 0.741,\n",
       " 0.741,\n",
       " 0.743,\n",
       " 0.746,\n",
       " 0.746,\n",
       " 0.747,\n",
       " 0.748,\n",
       " 0.749,\n",
       " 0.75,\n",
       " 0.75,\n",
       " 0.75,\n",
       " 0.75,\n",
       " 0.75,\n",
       " 0.75,\n",
       " 0.75,\n",
       " 0.752,\n",
       " 0.752,\n",
       " 0.754,\n",
       " 0.756,\n",
       " 0.756,\n",
       " 0.757,\n",
       " 0.759,\n",
       " 0.759,\n",
       " 0.759,\n",
       " 0.76,\n",
       " 0.76,\n",
       " 0.761,\n",
       " 0.762,\n",
       " 0.762,\n",
       " 0.762,\n",
       " 0.762,\n",
       " 0.763,\n",
       " 0.764,\n",
       " 0.764,\n",
       " 0.765,\n",
       " 0.766,\n",
       " 0.768,\n",
       " 0.769,\n",
       " 0.77,\n",
       " 0.771,\n",
       " 0.771,\n",
       " 0.771,\n",
       " 0.772,\n",
       " 0.772,\n",
       " 0.773,\n",
       " 0.774,\n",
       " 0.774,\n",
       " 0.775,\n",
       " 0.777,\n",
       " 0.777,\n",
       " 0.779,\n",
       " 0.78,\n",
       " 0.78,\n",
       " 0.78,\n",
       " 0.781,\n",
       " 0.783,\n",
       " 0.783,\n",
       " 0.785,\n",
       " 0.786,\n",
       " 0.786,\n",
       " 0.786,\n",
       " 0.786,\n",
       " 0.788,\n",
       " 0.788,\n",
       " 0.788,\n",
       " 0.788,\n",
       " 0.788,\n",
       " 0.79,\n",
       " 0.79,\n",
       " 0.79,\n",
       " 0.792,\n",
       " 0.792,\n",
       " 0.792,\n",
       " 0.795,\n",
       " 0.795,\n",
       " 0.795,\n",
       " 0.797,\n",
       " 0.797,\n",
       " 0.798,\n",
       " 0.799,\n",
       " 0.8,\n",
       " 0.801,\n",
       " 0.802,\n",
       " 0.803,\n",
       " 0.804,\n",
       " 0.804,\n",
       " 0.804,\n",
       " 0.806,\n",
       " 0.806,\n",
       " 0.808,\n",
       " 0.808,\n",
       " 0.808,\n",
       " 0.809,\n",
       " 0.81,\n",
       " 0.81,\n",
       " 0.811,\n",
       " 0.813,\n",
       " 0.813,\n",
       " 0.813,\n",
       " 0.813,\n",
       " 0.813,\n",
       " 0.813,\n",
       " 0.813,\n",
       " 0.813,\n",
       " 0.813,\n",
       " 0.813,\n",
       " 0.813,\n",
       " 0.813,\n",
       " 0.813,\n",
       " 0.813,\n",
       " 0.814,\n",
       " 0.814,\n",
       " 0.816,\n",
       " 0.817,\n",
       " 0.817,\n",
       " 0.817,\n",
       " 0.821,\n",
       " 0.821,\n",
       " 0.821,\n",
       " 0.823,\n",
       " 0.823,\n",
       " 0.824,\n",
       " 0.825,\n",
       " 0.825,\n",
       " 0.825,\n",
       " 0.826,\n",
       " 0.827,\n",
       " 0.827,\n",
       " 0.828,\n",
       " 0.828,\n",
       " 0.828,\n",
       " 0.83,\n",
       " 0.83,\n",
       " 0.83,\n",
       " 0.831,\n",
       " 0.831,\n",
       " 0.831,\n",
       " 0.832,\n",
       " 0.832,\n",
       " 0.832,\n",
       " 0.833,\n",
       " 0.833,\n",
       " 0.834,\n",
       " 0.835,\n",
       " 0.835,\n",
       " 0.836,\n",
       " 0.836,\n",
       " 0.837,\n",
       " 0.838,\n",
       " 0.839,\n",
       " 0.839,\n",
       " 0.839,\n",
       " 0.839,\n",
       " 0.84,\n",
       " 0.841,\n",
       " 0.842,\n",
       " 0.842,\n",
       " 0.842,\n",
       " 0.843,\n",
       " 0.843,\n",
       " 0.844,\n",
       " 0.844,\n",
       " 0.844,\n",
       " 0.845,\n",
       " 0.845,\n",
       " 0.845,\n",
       " 0.845,\n",
       " 0.846,\n",
       " 0.846,\n",
       " 0.846,\n",
       " 0.846,\n",
       " 0.847,\n",
       " 0.847,\n",
       " 0.847,\n",
       " 0.847,\n",
       " 0.847,\n",
       " 0.847,\n",
       " 0.848,\n",
       " 0.849,\n",
       " 0.849,\n",
       " 0.85,\n",
       " 0.85,\n",
       " 0.85,\n",
       " 0.851,\n",
       " 0.851,\n",
       " 0.851,\n",
       " 0.851,\n",
       " 0.852,\n",
       " 0.853,\n",
       " 0.853,\n",
       " 0.854,\n",
       " 0.854,\n",
       " 0.854,\n",
       " 0.855,\n",
       " 0.855,\n",
       " 0.855,\n",
       " 0.855,\n",
       " 0.856,\n",
       " 0.857,\n",
       " 0.857,\n",
       " 0.857,\n",
       " 0.857,\n",
       " 0.857,\n",
       " 0.858,\n",
       " 0.859,\n",
       " 0.859,\n",
       " 0.859,\n",
       " 0.859,\n",
       " 0.859,\n",
       " 0.861,\n",
       " 0.862,\n",
       " 0.863,\n",
       " 0.863,\n",
       " 0.863,\n",
       " 0.864,\n",
       " 0.864,\n",
       " 0.864,\n",
       " 0.864,\n",
       " 0.865,\n",
       " 0.865,\n",
       " 0.865,\n",
       " 0.866,\n",
       " 0.867,\n",
       " 0.867,\n",
       " 0.868,\n",
       " 0.869,\n",
       " 0.869,\n",
       " 0.869,\n",
       " 0.869,\n",
       " 0.87,\n",
       " 0.87,\n",
       " 0.871,\n",
       " 0.871,\n",
       " 0.872,\n",
       " 0.872,\n",
       " 0.872,\n",
       " 0.873,\n",
       " 0.874,\n",
       " 0.875,\n",
       " 0.875,\n",
       " 0.875,\n",
       " 0.875,\n",
       " 0.875,\n",
       " 0.875,\n",
       " 0.875,\n",
       " 0.875,\n",
       " 0.875,\n",
       " 0.875,\n",
       " 0.875,\n",
       " 0.875,\n",
       " 0.875,\n",
       " 0.875,\n",
       " 0.875,\n",
       " 0.875,\n",
       " 0.875,\n",
       " 0.875,\n",
       " 0.875,\n",
       " 0.875,\n",
       " 0.875,\n",
       " 0.875,\n",
       " 0.875,\n",
       " 0.875,\n",
       " 0.876,\n",
       " 0.876,\n",
       " 0.877,\n",
       " 0.877,\n",
       " 0.878,\n",
       " 0.878,\n",
       " 0.878,\n",
       " 0.879,\n",
       " 0.879,\n",
       " 0.879,\n",
       " 0.88,\n",
       " 0.88,\n",
       " 0.881,\n",
       " 0.881,\n",
       " 0.882,\n",
       " 0.882,\n",
       " 0.882,\n",
       " 0.882,\n",
       " 0.883,\n",
       " 0.883,\n",
       " 0.883,\n",
       " 0.883,\n",
       " 0.883,\n",
       " 0.883,\n",
       " 0.884,\n",
       " 0.885,\n",
       " 0.885,\n",
       " 0.886,\n",
       " 0.887,\n",
       " 0.887,\n",
       " 0.887,\n",
       " 0.888,\n",
       " 0.888,\n",
       " 0.888,\n",
       " 0.889,\n",
       " 0.889,\n",
       " 0.889,\n",
       " 0.889,\n",
       " 0.889,\n",
       " 0.89,\n",
       " 0.891,\n",
       " 0.892,\n",
       " 0.892,\n",
       " 0.892,\n",
       " 0.893,\n",
       " 0.893,\n",
       " 0.894,\n",
       " 0.895,\n",
       " 0.896,\n",
       " 0.896,\n",
       " 0.897,\n",
       " 0.897,\n",
       " 0.898,\n",
       " 0.898,\n",
       " 0.899,\n",
       " 0.9,\n",
       " 0.9,\n",
       " 0.9,\n",
       " 0.901,\n",
       " 0.901,\n",
       " 0.901,\n",
       " 0.902,\n",
       " 0.903,\n",
       " 0.903,\n",
       " 0.904,\n",
       " 0.904,\n",
       " 0.904,\n",
       " 0.905,\n",
       " 0.905,\n",
       " 0.905,\n",
       " 0.905,\n",
       " 0.906,\n",
       " 0.906,\n",
       " 0.906,\n",
       " 0.906,\n",
       " 0.907,\n",
       " 0.907,\n",
       " 0.908,\n",
       " 0.911,\n",
       " 0.911,\n",
       " 0.912,\n",
       " 0.914,\n",
       " 0.915,\n",
       " 0.915,\n",
       " 0.916,\n",
       " 0.916,\n",
       " 0.917,\n",
       " 0.917,\n",
       " 0.917,\n",
       " 0.917,\n",
       " 0.918,\n",
       " 0.918,\n",
       " 0.918,\n",
       " 0.919,\n",
       " 0.919,\n",
       " 0.919,\n",
       " 0.92,\n",
       " 0.92,\n",
       " 0.922,\n",
       " 0.922,\n",
       " 0.922,\n",
       " 0.922,\n",
       " 0.922,\n",
       " 0.924,\n",
       " 0.925,\n",
       " 0.925,\n",
       " 0.925,\n",
       " 0.925,\n",
       " 0.926,\n",
       " 0.926,\n",
       " 0.926,\n",
       " 0.926,\n",
       " 0.926,\n",
       " 0.926,\n",
       " 0.926,\n",
       " 0.926,\n",
       " 0.926,\n",
       " 0.926,\n",
       " 0.927,\n",
       " 0.927,\n",
       " 0.927,\n",
       " 0.927,\n",
       " 0.928,\n",
       " 0.928,\n",
       " 0.928,\n",
       " 0.928,\n",
       " 0.928,\n",
       " 0.929,\n",
       " 0.93,\n",
       " 0.93,\n",
       " 0.931,\n",
       " 0.931,\n",
       " 0.931,\n",
       " 0.931,\n",
       " 0.931,\n",
       " 0.931,\n",
       " 0.932,\n",
       " 0.932,\n",
       " 0.932,\n",
       " 0.932,\n",
       " 0.933,\n",
       " 0.933,\n",
       " 0.933,\n",
       " 0.934,\n",
       " 0.934,\n",
       " 0.934,\n",
       " 0.934,\n",
       " 0.934,\n",
       " 0.935,\n",
       " 0.935,\n",
       " 0.935,\n",
       " 0.936,\n",
       " 0.936,\n",
       " 0.936,\n",
       " 0.936,\n",
       " 0.938,\n",
       " 0.938,\n",
       " 0.938,\n",
       " 0.938,\n",
       " 0.938,\n",
       " 0.938,\n",
       " 0.938,\n",
       " 0.938,\n",
       " 0.938,\n",
       " 0.938,\n",
       " 0.938,\n",
       " 0.939,\n",
       " 0.939,\n",
       " 0.94,\n",
       " 0.94,\n",
       " 0.942,\n",
       " 0.942,\n",
       " 0.943,\n",
       " 0.943,\n",
       " 0.944,\n",
       " 0.944,\n",
       " 0.944,\n",
       " 0.945,\n",
       " 0.945,\n",
       " 0.946,\n",
       " 0.946,\n",
       " 0.946,\n",
       " 0.946,\n",
       " 0.946,\n",
       " 0.946,\n",
       " 0.946,\n",
       " 0.947,\n",
       " 0.947,\n",
       " 0.948,\n",
       " 0.948,\n",
       " 0.948,\n",
       " 0.949,\n",
       " 0.949,\n",
       " 0.95,\n",
       " 0.95,\n",
       " 0.95,\n",
       " 0.95,\n",
       " 0.95,\n",
       " 0.951,\n",
       " 0.952,\n",
       " 0.952,\n",
       " 0.953,\n",
       " 0.953,\n",
       " 0.953,\n",
       " 0.953,\n",
       " 0.954,\n",
       " 0.955,\n",
       " 0.955,\n",
       " 0.955,\n",
       " 0.955,\n",
       " 0.955,\n",
       " 0.956,\n",
       " 0.957,\n",
       " 0.957,\n",
       " 0.957,\n",
       " 0.958,\n",
       " 0.958,\n",
       " 0.958,\n",
       " 0.958,\n",
       " 0.958,\n",
       " 0.958,\n",
       " 0.96,\n",
       " 0.96,\n",
       " 0.96,\n",
       " 0.96,\n",
       " 0.96,\n",
       " 0.96,\n",
       " 0.961,\n",
       " 0.961,\n",
       " 0.962,\n",
       " 0.962,\n",
       " 0.962,\n",
       " 0.962,\n",
       " 0.962,\n",
       " 0.962,\n",
       " 0.962,\n",
       " 0.963,\n",
       " 0.964,\n",
       " 0.964,\n",
       " 0.964,\n",
       " 0.964,\n",
       " 0.965,\n",
       " 0.965,\n",
       " 0.965,\n",
       " 0.966,\n",
       " 0.966,\n",
       " 0.966,\n",
       " 0.967,\n",
       " 0.967,\n",
       " 0.967,\n",
       " 0.968,\n",
       " 0.968,\n",
       " 0.969,\n",
       " 0.969,\n",
       " 0.969,\n",
       " 0.969,\n",
       " 0.97,\n",
       " 0.971,\n",
       " 0.972,\n",
       " 0.972,\n",
       " 0.973,\n",
       " 0.973,\n",
       " 0.973,\n",
       " 0.974,\n",
       " 0.974,\n",
       " 0.974,\n",
       " 0.974,\n",
       " 0.976,\n",
       " 0.976,\n",
       " 0.976,\n",
       " 0.976,\n",
       " 0.977,\n",
       " 0.977,\n",
       " 0.978,\n",
       " 0.978,\n",
       " 0.978,\n",
       " 0.979,\n",
       " 0.979,\n",
       " ...]"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "sorted(Ytest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(range(len(Ytest)),sorted(Ytest),c=\"black\",label= \"Data\")\n",
    "plt.plot(range(len(yhat)),sorted(yhat),c=\"red\",label = \"Predict\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-179.12952605,   -5.692624  ,  -15.61747513,  -78.68042858,\n",
       "        -59.5311006 ])"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "rng = np.random.RandomState(42)\n",
    "X = rng.randn(100, 80)\n",
    "y = rng.randn(100)\n",
    "cross_val_score(LR(), X, y, cv=5, scoring='r2')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "from sklearn.linear_model import Ridge, LinearRegression, Lasso\n",
    "from sklearn.model_selection import train_test_split as TTS\n",
    "from sklearn.datasets import fetch_california_housing as fch\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "housevalue = fch()\n",
    "\n",
    "X = pd.DataFrame(housevalue.data)\n",
    "y = housevalue.target\n",
    "X.columns = [\"住户收入中位数\",\"房屋使用年代中位数\",\"平均房间数目\"\n",
    "            ,\"平均卧室数目\",\"街区人口\",\"平均入住率\",\"街区的纬度\",\"街区的经度\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>住户收入中位数</th>\n",
       "      <th>房屋使用年代中位数</th>\n",
       "      <th>平均房间数目</th>\n",
       "      <th>平均卧室数目</th>\n",
       "      <th>街区人口</th>\n",
       "      <th>平均入住率</th>\n",
       "      <th>街区的纬度</th>\n",
       "      <th>街区的经度</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>8.3252</td>\n",
       "      <td>41.0</td>\n",
       "      <td>6.984127</td>\n",
       "      <td>1.023810</td>\n",
       "      <td>322.0</td>\n",
       "      <td>2.555556</td>\n",
       "      <td>37.88</td>\n",
       "      <td>-122.23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8.3014</td>\n",
       "      <td>21.0</td>\n",
       "      <td>6.238137</td>\n",
       "      <td>0.971880</td>\n",
       "      <td>2401.0</td>\n",
       "      <td>2.109842</td>\n",
       "      <td>37.86</td>\n",
       "      <td>-122.22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>7.2574</td>\n",
       "      <td>52.0</td>\n",
       "      <td>8.288136</td>\n",
       "      <td>1.073446</td>\n",
       "      <td>496.0</td>\n",
       "      <td>2.802260</td>\n",
       "      <td>37.85</td>\n",
       "      <td>-122.24</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>5.6431</td>\n",
       "      <td>52.0</td>\n",
       "      <td>5.817352</td>\n",
       "      <td>1.073059</td>\n",
       "      <td>558.0</td>\n",
       "      <td>2.547945</td>\n",
       "      <td>37.85</td>\n",
       "      <td>-122.25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3.8462</td>\n",
       "      <td>52.0</td>\n",
       "      <td>6.281853</td>\n",
       "      <td>1.081081</td>\n",
       "      <td>565.0</td>\n",
       "      <td>2.181467</td>\n",
       "      <td>37.85</td>\n",
       "      <td>-122.25</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   住户收入中位数  房屋使用年代中位数    平均房间数目    平均卧室数目    街区人口     平均入住率  街区的纬度   街区的经度\n",
       "0   8.3252       41.0  6.984127  1.023810   322.0  2.555556  37.88 -122.23\n",
       "1   8.3014       21.0  6.238137  0.971880  2401.0  2.109842  37.86 -122.22\n",
       "2   7.2574       52.0  8.288136  1.073446   496.0  2.802260  37.85 -122.24\n",
       "3   5.6431       52.0  5.817352  1.073059   558.0  2.547945  37.85 -122.25\n",
       "4   3.8462       52.0  6.281853  1.081081   565.0  2.181467  37.85 -122.25"
      ]
     },
     "execution_count": 130,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 159,
   "metadata": {},
   "outputs": [],
   "source": [
    "Xtrain,Xtest,Ytrain,Ytest = TTS(X,y,test_size=0.3,random_state=420)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 160,
   "metadata": {},
   "outputs": [],
   "source": [
    "for i in [Xtrain,Xtest]:\n",
    "    i.index = range(i.shape[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>住户收入中位数</th>\n",
       "      <th>房屋使用年代中位数</th>\n",
       "      <th>平均房间数目</th>\n",
       "      <th>平均卧室数目</th>\n",
       "      <th>街区人口</th>\n",
       "      <th>平均入住率</th>\n",
       "      <th>街区的纬度</th>\n",
       "      <th>街区的经度</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>4.1776</td>\n",
       "      <td>35.0</td>\n",
       "      <td>4.425172</td>\n",
       "      <td>1.030683</td>\n",
       "      <td>5380.0</td>\n",
       "      <td>3.368817</td>\n",
       "      <td>37.48</td>\n",
       "      <td>-122.19</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>5.3261</td>\n",
       "      <td>38.0</td>\n",
       "      <td>6.267516</td>\n",
       "      <td>1.089172</td>\n",
       "      <td>429.0</td>\n",
       "      <td>2.732484</td>\n",
       "      <td>37.53</td>\n",
       "      <td>-122.30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.9439</td>\n",
       "      <td>26.0</td>\n",
       "      <td>5.768977</td>\n",
       "      <td>1.141914</td>\n",
       "      <td>891.0</td>\n",
       "      <td>2.940594</td>\n",
       "      <td>36.02</td>\n",
       "      <td>-119.08</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2.5000</td>\n",
       "      <td>22.0</td>\n",
       "      <td>4.916000</td>\n",
       "      <td>1.012000</td>\n",
       "      <td>733.0</td>\n",
       "      <td>2.932000</td>\n",
       "      <td>38.57</td>\n",
       "      <td>-121.31</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3.8250</td>\n",
       "      <td>34.0</td>\n",
       "      <td>5.036765</td>\n",
       "      <td>1.098039</td>\n",
       "      <td>1134.0</td>\n",
       "      <td>2.779412</td>\n",
       "      <td>33.91</td>\n",
       "      <td>-118.35</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   住户收入中位数  房屋使用年代中位数    平均房间数目    平均卧室数目    街区人口     平均入住率  街区的纬度   街区的经度\n",
       "0   4.1776       35.0  4.425172  1.030683  5380.0  3.368817  37.48 -122.19\n",
       "1   5.3261       38.0  6.267516  1.089172   429.0  2.732484  37.53 -122.30\n",
       "2   1.9439       26.0  5.768977  1.141914   891.0  2.940594  36.02 -119.08\n",
       "3   2.5000       22.0  4.916000  1.012000   733.0  2.932000  38.57 -121.31\n",
       "4   3.8250       34.0  5.036765  1.098039  1134.0  2.779412  33.91 -118.35"
      ]
     },
     "execution_count": 133,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Xtrain.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 162,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6043610352312276"
      ]
     },
     "execution_count": 162,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#使用岭回归来进行建模\n",
    "reg = Ridge(alpha=1).fit(Xtrain,Ytrain)\n",
    "reg.score(Xtest,Ytest) #加利佛尼亚房屋价值数据集中应该不是共线性问题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#交叉验证下，与线性回归相比，岭回归的结果如何变化？\n",
    "alpharange = np.arange(1,1001,100)\n",
    "ridge, lr = [], []\n",
    "for alpha in alpharange:\n",
    "    reg = Ridge(alpha=alpha)\n",
    "    linear = LinearRegression()\n",
    "    regs = cross_val_score(reg,X,y,cv=5,scoring = \"r2\").mean()\n",
    "    linears = cross_val_score(linear,X,y,cv=5,scoring = \"r2\").mean()\n",
    "    ridge.append(regs)\n",
    "    lr.append(linears)\n",
    "plt.plot(alpharange,ridge,color=\"red\",label=\"Ridge\")\n",
    "plt.plot(alpharange,lr,color=\"orange\",label=\"LR\")\n",
    "plt.title(\"Mean\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6043668160178813"
      ]
     },
     "execution_count": 139,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#使用岭回归来进行建模\n",
    "reg = Ridge(alpha=0).fit(Xtrain,Ytrain)\n",
    "reg.score(Xtest,Ytest) #加利佛尼亚房屋价值数据集中应该不是共线性问题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZYAAAEICAYAAAB8lNKlAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvDW2N/gAAIABJREFUeJzt3XecVNX9//HXG5QmoKBopCgLEgEjQlgxBnssGGmKChojEI0lQRSjwfY1BBLFEsSCHZTYwAIG4k+NGtFERVkMoDSlKK5YEIxAROrn98e5i5dllx12Z/fOzH6ej8c8ZubMvXc+Mzs7nznnniIzwznnnEuXGkkH4JxzLrd4YnHOOZdWnlicc86llScW55xzaeWJxTnnXFp5YnHOOZdWnlicc86llScW5ypA0keSNkjaq1j5LEkmqWUykTmXHE8szlXcUuCsojuSDgbqJheOc8nyxOJcxT0CnBu73x/4a9EdSbUl3SppmaQvJN0rqW70WCNJf5e0QtLX0e3msX2nSRoh6Q1JayT9o3jtyLlM44nFuYqbDjSU1E5STaAv8Gjs8ZuAHwIdgQOAZsD10WM1gIeA/YH9gHXAXcWOfzYwENgbqAVcUTkvw7n08MTiXHoU1VpOABYAn0blAn4NDDGzVWa2BrgB6AdgZivN7Bkz+zZ67M/A0cWO/ZCZfWBm64AnCQnKuYy1S9IBOJcjHgFeB/KINYMBTYB6wExJRWUCagJIqgfcBnQDGkWPN5BU08w2R/c/jx3vW6B+ZbwA59LFayzOpYGZfUw4if9zYFLsoa8IzVsHmdke0WV3MytKDr8DDgQOM7OGwFFRuXAuS3licS59zgOOM7P/xcq2AA8At0naG0BSM0knRY83ICSe/0pqDPyhKgN2rjJ4YnEuTcxssZkVlPDQUGARMF3SauBlQi0FYDSha/JXhE4AL1RFrM5VJvlCX84559LJayzOOefSyhOLc865tPLE4pxzLq08sTjnnEurnB4guddee1nLli2TDsM557LKzJkzvzKzJuXdP6cTS8uWLSkoKKn3p3POudJI+rgi+3tTmHPOubTyxOKccy6tPLE455xLq5w+x+Kcc2XZuHEjhYWFfPfdd0mHUuXq1KlD8+bN2XXXXdN6XE8szrlqrbCwkAYNGtCyZUtiSxvkPDNj5cqVFBYWkpeXl9Zje1OYc65a++6779hzzz2rVVIBkMSee+5ZKTU1TyzOuWqvuiWVIpX1ur0pzLkimzbB4sWwYAEsXAi1a0PLlrD//uGyxx5QTb+AnNsZnlhc9bN2bUgeCxbA/PnfXy9aBBs3lr5fgwbfJ5l4wim67LOPJx5XLjVr1uTggw9m06ZN5OXl8cgjj7DHHnuwfPlyBg8ezNNPP73dPscccwy33nor+fn5CUS8Y55YXG4yg88/3z55LFgAhYXfb1ezJhxwALRrB716heu2beHAA2HDBvj44+0vH30Eb7wB//3vts9Zuzbst9/3Sefoo+G006Bevap85S4L1a1bl1mzZgHQv39/xowZw7XXXkvTpk1LTCqZzhOLyy1r1sADD8Do0fDJJ9+X168fksaxx36fPNq2hdatoVat0o/XpAmU9otw9ertE07R7WefhQcfhN/8Bs48EwYMgK5dvUbjynT44YczZ84cAD766CO6d+/O+++/z7p16xg4cCDz5s2jXbt2rFu3bus+Y8eO5aabbqJp06a0adOG2rVrc9ddd7FixQouuugili1bBsDo0aPp2rVrpb8GTywuN3z5Jdx5J9x1V6hJHHssXHllSCLt2kHTpun/Um/YEA4+OFyKM4N//QsefhgmTICxY0PNaMAA+OUvQ83GZZ7LLoOo5pA2HTuGHzop2Lx5M6+88grnnXfedo/dc8891KtXjzlz5jBnzhx+/OMfA7B8+XJGjBjBu+++S4MGDTjuuOM45JBDALj00ksZMmQIRxxxBMuWLeOkk05i/vz56XttpfDE4rLb0qXwl7+EL+716+HUU2HoUOjSJdm4JDjqqHC54w545pmQZK67Dv7v/+BnP4OBA6F3b28qc6xbt46OHTvy0Ucf0blzZ0444YTttnn99dcZPHgwAB06dKBDhw4AvPPOOxx99NE0btwYgDPOOIMPPvgAgJdffpl58+ZtPcbq1atZs2YNDRo0qNTX44nFZafZs+Hmm2HiRKhRA849N9RQDjww6ci2V78+9O8fLkuXwl//GpLML34Raj19+4aazOGHe1NZ0lKsWaRb0TmWb775hu7duzNmzJitSSSupO7BZlbqcbds2cJbb71F3bp10xpvWXwci8seZvDaa3DyyaF5YcoUGDIkfFk/+GBmJpXi8vLgD38I3ZpffTXUsB57LJx/adsWbrxx284FrlrZfffdueOO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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#细化一下学习曲线\n",
    "alpharange = np.arange(1,201,10)\n",
    "ridge, lr = [], []\n",
    "for alpha in alpharange:\n",
    "    reg = Ridge(alpha=alpha)\n",
    "    linear = LinearRegression()\n",
    "    regs = cross_val_score(reg,X,y,cv=5,scoring = \"r2\").mean()\n",
    "    linears = cross_val_score(linear,X,y,cv=5,scoring = \"r2\").mean()\n",
    "    ridge.append(regs)\n",
    "    lr.append(linears)\n",
    "plt.plot(alpharange,ridge,color=\"red\",label=\"Ridge\")\n",
    "plt.plot(alpharange,lr,color=\"orange\",label=\"LR\")\n",
    "plt.title(\"Mean\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#模型方差如何变化？\n",
    "alpharange = np.arange(1,1001,100)\n",
    "ridge, lr = [], []\n",
    "for alpha in alpharange:\n",
    "    reg = Ridge(alpha=alpha)\n",
    "    linear = LinearRegression()\n",
    "    varR = cross_val_score(reg,X,y,cv=5,scoring=\"r2\").var()\n",
    "    varLR = cross_val_score(linear,X,y,cv=5,scoring=\"r2\").var()\n",
    "    ridge.append(varR)\n",
    "    lr.append(varLR)\n",
    "plt.plot(alpharange,ridge,color=\"red\",label=\"Ridge\")\n",
    "plt.plot(alpharange,lr,color=\"orange\",label=\"LR\")\n",
    "plt.title(\"Variance\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 163,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import load_boston\n",
    "from sklearn.model_selection import cross_val_score\n",
    "\n",
    "X = load_boston().data\n",
    "y = load_boston().target\n",
    "\n",
    "Xtrain,Xtest,Ytrain,Ytest = TTS(X,y,test_size=0.3,random_state=420)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(506, 13)"
      ]
     },
     "execution_count": 164,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#先查看方差的变化\n",
    "alpharange = np.arange(1,1001,100)\n",
    "ridge, lr = [], []\n",
    "for alpha in alpharange:\n",
    "    reg = Ridge(alpha=alpha)\n",
    "    linear = LinearRegression()\n",
    "    varR = cross_val_score(reg,X,y,cv=5,scoring=\"r2\").var()\n",
    "    varLR = cross_val_score(linear,X,y,cv=5,scoring=\"r2\").var()\n",
    "    ridge.append(varR)\n",
    "    lr.append(varLR)\n",
    "plt.plot(alpharange,ridge,color=\"red\",label=\"Ridge\")\n",
    "plt.plot(alpharange,lr,color=\"orange\",label=\"LR\")\n",
    "plt.title(\"Variance\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 166,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#查看R2的变化\n",
    "alpharange = np.arange(1,1001,100)\n",
    "ridge, lr = [], []\n",
    "for alpha in alpharange:\n",
    "    reg = Ridge(alpha=alpha)\n",
    "    linear = LinearRegression()\n",
    "    regs = cross_val_score(reg,X,y,cv=5,scoring = \"r2\").mean()\n",
    "    linears = cross_val_score(linear,X,y,cv=5,scoring = \"r2\").mean()\n",
    "    ridge.append(regs)\n",
    "    lr.append(linears)\n",
    "plt.plot(alpharange,ridge,color=\"red\",label=\"Ridge\")\n",
    "plt.plot(alpharange,lr,color=\"orange\",label=\"LR\")\n",
    "plt.title(\"Mean\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 168,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#细化学习曲线\n",
    "alpharange = np.arange(100,300,10)\n",
    "ridge, lr = [], []\n",
    "for alpha in alpharange:\n",
    "    reg = Ridge(alpha=alpha)\n",
    "    #linear = LinearRegression()\n",
    "    regs = cross_val_score(reg,X,y,cv=5,scoring = \"r2\").mean()\n",
    "    #linears = cross_val_score(linear,X,y,cv=5,scoring = \"r2\").mean()\n",
    "    ridge.append(regs)\n",
    "    lr.append(linears)\n",
    "plt.plot(alpharange,ridge,color=\"red\",label=\"Ridge\")\n",
    "#plt.plot(alpharange,lr,color=\"orange\",label=\"LR\")\n",
    "plt.title(\"Mean\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 169,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "from sklearn.linear_model import RidgeCV, LinearRegression\n",
    "from sklearn.model_selection import train_test_split as TTS\n",
    "from sklearn.datasets import fetch_california_housing as fch\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "housevalue = fch()\n",
    "\n",
    "X = pd.DataFrame(housevalue.data)\n",
    "y = housevalue.target\n",
    "X.columns = [\"住户收入中位数\",\"房屋使用年代中位数\",\"平均房间数目\"\n",
    "            ,\"平均卧室数目\",\"街区人口\",\"平均入住率\",\"街区的纬度\",\"街区的经度\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 192,
   "metadata": {},
   "outputs": [],
   "source": [
    "Ridge_ = RidgeCV(alphas=np.arange(1,1001,100)\n",
    "                 #,scoring=\"neg_mean_squared_error\"\n",
    "                 ,store_cv_values=True\n",
    "                 #,cv=5\n",
    "                ).fit(X, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 193,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6060251767338429"
      ]
     },
     "execution_count": 193,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#无关交叉验证的岭回归结果\n",
    "Ridge_.score(X,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 194,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.1557472 , 0.16301246, 0.16892723, ..., 0.18881663, 0.19182353,\n",
       "        0.19466385],\n",
       "       [0.15334566, 0.13922075, 0.12849014, ..., 0.09744906, 0.09344092,\n",
       "        0.08981868],\n",
       "       [0.02429857, 0.03043271, 0.03543001, ..., 0.04971514, 0.05126165,\n",
       "        0.05253834],\n",
       "       ...,\n",
       "       [0.56545783, 0.5454654 , 0.52655917, ..., 0.44532597, 0.43130136,\n",
       "        0.41790336],\n",
       "       [0.27883123, 0.2692305 , 0.25944481, ..., 0.21328675, 0.20497018,\n",
       "        0.19698274],\n",
       "       [0.14313527, 0.13967826, 0.13511341, ..., 0.1078647 , 0.10251737,\n",
       "        0.0973334 ]])"
      ]
     },
     "execution_count": 194,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#调用所有交叉验证的结果\n",
    "Ridge_.cv_values_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 195,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.52823795, 0.52787439, 0.52807763, 0.52855759, 0.52917958,\n",
       "       0.52987689, 0.53061486, 0.53137481, 0.53214638, 0.53292369])"
      ]
     },
     "execution_count": 195,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#进行平均后可以查看每个正则化系数取值下的交叉验证结果\n",
    "Ridge_.cv_values_.mean(axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 191,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "101"
      ]
     },
     "execution_count": 191,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#查看被选择出来的最佳正则化系数\n",
    "Ridge_.alpha_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 196,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>住户收入中位数</th>\n",
       "      <th>房屋使用年代中位数</th>\n",
       "      <th>平均房间数目</th>\n",
       "      <th>平均卧室数目</th>\n",
       "      <th>街区人口</th>\n",
       "      <th>平均入住率</th>\n",
       "      <th>街区的纬度</th>\n",
       "      <th>街区的经度</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>8.3252</td>\n",
       "      <td>41.0</td>\n",
       "      <td>6.984127</td>\n",
       "      <td>1.023810</td>\n",
       "      <td>322.0</td>\n",
       "      <td>2.555556</td>\n",
       "      <td>37.88</td>\n",
       "      <td>-122.23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8.3014</td>\n",
       "      <td>21.0</td>\n",
       "      <td>6.238137</td>\n",
       "      <td>0.971880</td>\n",
       "      <td>2401.0</td>\n",
       "      <td>2.109842</td>\n",
       "      <td>37.86</td>\n",
       "      <td>-122.22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>7.2574</td>\n",
       "      <td>52.0</td>\n",
       "      <td>8.288136</td>\n",
       "      <td>1.073446</td>\n",
       "      <td>496.0</td>\n",
       "      <td>2.802260</td>\n",
       "      <td>37.85</td>\n",
       "      <td>-122.24</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>5.6431</td>\n",
       "      <td>52.0</td>\n",
       "      <td>5.817352</td>\n",
       "      <td>1.073059</td>\n",
       "      <td>558.0</td>\n",
       "      <td>2.547945</td>\n",
       "      <td>37.85</td>\n",
       "      <td>-122.25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3.8462</td>\n",
       "      <td>52.0</td>\n",
       "      <td>6.281853</td>\n",
       "      <td>1.081081</td>\n",
       "      <td>565.0</td>\n",
       "      <td>2.181467</td>\n",
       "      <td>37.85</td>\n",
       "      <td>-122.25</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   住户收入中位数  房屋使用年代中位数    平均房间数目    平均卧室数目    街区人口     平均入住率  街区的纬度   街区的经度\n",
       "0   8.3252       41.0  6.984127  1.023810   322.0  2.555556  37.88 -122.23\n",
       "1   8.3014       21.0  6.238137  0.971880  2401.0  2.109842  37.86 -122.22\n",
       "2   7.2574       52.0  8.288136  1.073446   496.0  2.802260  37.85 -122.24\n",
       "3   5.6431       52.0  5.817352  1.073059   558.0  2.547945  37.85 -122.25\n",
       "4   3.8462       52.0  6.281853  1.081081   565.0  2.181467  37.85 -122.25"
      ]
     },
     "execution_count": 196,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "from sklearn.linear_model import Ridge, LinearRegression, Lasso\n",
    "from sklearn.model_selection import train_test_split as TTS\n",
    "from sklearn.datasets import fetch_california_housing as fch\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "housevalue = fch()\n",
    "\n",
    "X = pd.DataFrame(housevalue.data)\n",
    "y = housevalue.target\n",
    "X.columns = [\"住户收入中位数\",\"房屋使用年代中位数\",\"平均房间数目\"\n",
    "            ,\"平均卧室数目\",\"街区人口\",\"平均入住率\",\"街区的纬度\",\"街区的经度\"]\n",
    "\n",
    "X.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 197,
   "metadata": {},
   "outputs": [],
   "source": [
    "Xtrain,Xtest,Ytrain,Ytest = TTS(X,y,test_size=0.3,random_state=420)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 198,
   "metadata": {},
   "outputs": [],
   "source": [
    "for i in [Xtrain,Xtest]:\n",
    "    i.index = range(i.shape[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 199,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[43.73589305968403,\n",
       " 1.0211268294494038,\n",
       " -10.780721617317715,\n",
       " 62.64338275363783,\n",
       " 5.216125353178735e-05,\n",
       " -0.33485096463336095,\n",
       " -41.30959378947711,\n",
       " -42.621095362084674]"
      ]
     },
     "execution_count": 199,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#线性回归进行拟合\n",
    "reg = LinearRegression().fit(Xtrain,Ytrain)\n",
    "(reg.coef_*100).tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 203,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[43.735893059684045,\n",
       " 1.0211268294494151,\n",
       " -10.780721617317626,\n",
       " 62.64338275363741,\n",
       " 5.2161253532713044e-05,\n",
       " -0.3348509646333588,\n",
       " -41.3095937894767,\n",
       " -42.62109536208427]"
      ]
     },
     "execution_count": 203,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#岭回归进行拟合\n",
    "Ridge_ = Ridge(alpha=0).fit(Xtrain,Ytrain)\n",
    "(Ridge_.coef_*100).tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 201,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Python\\lib\\site-packages\\ipykernel_launcher.py:2: UserWarning: With alpha=0, this algorithm does not converge well. You are advised to use the LinearRegression estimator\n",
      "  \n",
      "C:\\Python\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:478: UserWarning: Coordinate descent with no regularization may lead to unexpected results and is discouraged.\n",
      "  positive)\n",
      "C:\\Python\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:492: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Fitting data with very small alpha may cause precision problems.\n",
      "  ConvergenceWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[43.735893059684024,\n",
       " 1.0211268294494056,\n",
       " -10.78072161731769,\n",
       " 62.64338275363792,\n",
       " 5.2161253532654165e-05,\n",
       " -0.33485096463335706,\n",
       " -41.3095937894772,\n",
       " -42.62109536208478]"
      ]
     },
     "execution_count": 201,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Lasso进行拟合\n",
    "lasso_ = Lasso(alpha=0).fit(Xtrain,Ytrain)\n",
    "(lasso_.coef_*100).tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 213,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[43.73453480786963,\n",
       " 1.0211508518425705,\n",
       " -10.778109335481922,\n",
       " 62.62978997580449,\n",
       " 5.225552031939166e-05,\n",
       " -0.33484783635443754,\n",
       " -41.309370065387334,\n",
       " -42.62068050768429]"
      ]
     },
     "execution_count": 213,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#岭回归进行拟合\n",
    "Ridge_ = Ridge(alpha=0.1).fit(Xtrain,Ytrain)\n",
    "(Ridge_.coef_*100).tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 214,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[39.08851438329683,\n",
       " 1.6054695654279871,\n",
       " -0.0,\n",
       " 0.0,\n",
       " 0.0023777014839091357,\n",
       " -0.3050186895638113,\n",
       " -10.771509301655533,\n",
       " -9.294344477958068]"
      ]
     },
     "execution_count": 214,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Lasso进行拟合\n",
    "lasso_ = Lasso(alpha=0.1).fit(Xtrain,Ytrain)\n",
    "(lasso_.coef_*100).tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "[43.73589305968403,\n",
    " 1.0211268294494038,\n",
    " -10.780721617317715,\n",
    " 62.64338275363783,\n",
    " 5.216125353178735e-05,\n",
    " -0.33485096463336095,\n",
    " -41.30959378947711,\n",
    " -42.621095362084674]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 220,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0.00021838533330206371,\n",
       " 0.00021344956264503437,\n",
       " 6.213673042878624e-05,\n",
       " -3.828084920732734e-06,\n",
       " -0.0014984087286952859,\n",
       " -4.175243714653836e-05,\n",
       " -5.29506119447496e-05,\n",
       " -1.3268982521957727e-05]"
      ]
     },
     "execution_count": 220,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#加大正则项系数，观察模型的系数发生了什么变化\n",
    "Ridge_ = Ridge(alpha=10**10).fit(Xtrain,Ytrain)\n",
    "(Ridge_.coef_*100).tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 217,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0.0, 0.0, 0.0, -0.0, -0.0, -0.0, -0.0, -0.0]"
      ]
     },
     "execution_count": 217,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lasso_ = Lasso(alpha=10**4).fit(Xtrain,Ytrain)\n",
    "(lasso_.coef_*100).tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 218,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[14.581141247629423,\n",
       " 0.6209347344423876,\n",
       " 0.0,\n",
       " -0.0,\n",
       " -0.00028065986329009983,\n",
       " -0.0,\n",
       " -0.0,\n",
       " -0.0]"
      ]
     },
     "execution_count": 218,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#看来10**4对于Lasso来说是一个过于大的取值\n",
    "lasso_ = Lasso(alpha=1).fit(Xtrain,Ytrain)\n",
    "(lasso_.coef_*100).tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 219,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAEKCAYAAAARnO4WAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvDW2N/gAAIABJREFUeJzt3Xd4VFX6wPHvSe+BEJASMKBIDwFCE4govQiKXSGx7LruqisoCwiWuKgIIijK6rrrz0VFFIGJgg2QqqCUiAgEkF6VHmoCSc7vjzOBhFSSmdwp7+d55ply78x9CTPvnDn3nPcorTVCCCE8n4/VAQghhKgckvCFEMJLSMIXQggvIQlfCCG8hCR8IYTwEpLwhRDCS0jCF0IILyEJXwghvIQkfCGE8BJ+VgeQX3R0tI6NjbU6DCGEcCtr1649orWuXtp+LpXwY2NjWbNmjdVhCCGEW1FK7S7LftKlI4QQXkISvhBCeAlJ+EII4SVcqg9fCCFKcuHCBfbt20dmZqbVoVgiKCiImJgY/P39y/V8SfhCCLexb98+wsPDiY2NRSlldTiVSmvN0aNH2bdvH/Xr1y/Xa0iXjhDCbWRmZlKtWjWvS/YASimqVatWoV83kvCFEG7FG5N9nor+2yXhC8/y1VewaZPVUQjhkiThC89x+jTcdhv89a9WRyI8WFhYWKHHUlJSqFOnDvHx8TRt2pQZM2ZYEFnpJOELz/Htt5CZCcuWwc6dVkcjvMywYcNYt24dn3/+OX/5y1+4cOGC1SEV4pCEr5SqopSapZTarJRKV0p1VEpFKaUWKKV+s19XdcSxhCiWzQYREeb2hx9aG4vwWg0bNiQkJITjx49bHUohjhqW+Qbwjdb6dqVUABACjAa+01q/opQaBYwCRjroeEIUdP48zJtnunR27YIPPoBnnwUvPsHn8YYOhXXrHPua8fHw+usVeom0tDQaNmxIjRo1HBSU41S4ha+UigASgfcAtNbntdYngIHANPtu04BbKnosIYq1ZAlkZMCtt0JyMmzfDitWWB2V8CKTJ0+mUaNGtG/fnpSUFKvDKZIjWvgNgMPA+0qplsBa4AngKq31QQCt9UGlVJFfd0qph4GHAerVq+eAcIRXSk2F0FDo3h1ycuBvf4Np06BTJ6sjE85SwZa4ow0bNozhw4czZ84ckpKS2L59O0FBQVaHVYAj+vD9gNbA21rrVsAZTPdNmWit39VaJ2itE6pXL7WcsxCF5eaahN+7NwQHQ1iY6dqZORPOnbM6OuFlBg0aREJCAtOmTSt950rmiIS/D9intf7Jfn8W5gvgD6VULQD79SEHHEuIwlatgoMHTXdOnuRk08XzxRfWxSU80tmzZ4mJibl4mTRpUqF9nnvuOSZNmkRubq4FERavwl06WuvflVJ7lVKNtNZbgG7AJvslGXjFfv15RY8lRJFsNvDzg379Lj3WtSvExJhunbvusiw04XnKksTbtGnDli1bKiGaK+OoUTqPA9PtI3R2AA9gfj3MVEo9BOwB7nDQsYS4RGuT8G+8EapUufS4ry8MGQLjx8Pvv0PNmtbFKISLcMg4fK31Ons/fJzW+hat9XGt9VGtdTetdUP79TFHHEuIAtLT4bffCnbn5ElKMv3706dXflxCuCCZaSvcm81mrgcOLLytcWNo185062hduXEJ4YIk4Qv3lpoKHTpA7dpFb09Ohl9/hV9+qdy4hHBBkvCF+9q7F9asgVtKmNN3993g729a+UJ4OUn4wn2lpprrovrv80RFwc03w8cfgwsWsxKiMknCF+7LZoOmTeG660reLzkZDh0y1TSFqCBfX1/i4+Np3rw5N998MydOnADgwIED3H777UU+p2vXrqxZs6YywyySJHzhno4eNWWQS2rd5+ndG6KjpVtHOERwcDDr1q1jw4YNREVFMXXqVABq167NrFmzLI6uZJLwhXuaN8/UzCmp/z5PQADce6+ZdeuCJWuF++rYsSP79+8HYNeuXTRv3hyAc+fOcffddxMXF8ddd93FuXwlPt577z2uu+46unbtyp///Gcee+wxAA4fPsxtt91G27Ztadu2LT/88IPD43XUxCshKpfNBnXrQps2Zds/ORmmTIFPP4VHHnFubKJyrB0Kxx1cHrlqPLQpW1G2nJwcvvvuOx566KFC295++21CQkJYv34969evp3Xr1oDp9hk7dixpaWmEh4dz00030bJlSwCeeOIJhg0bRufOndmzZw+9evUiPT3dcf82pIUv3NGZM6Y//pZbyl7vvlUraNZMunVEhZ07d474+HiqVavGsWPH6NGjR6F9li1bxuDBgwGIi4sjLi4OgFWrVnHDDTcQFRWFv78/d9xxqQDBwoULeeyxx4iPj2fAgAGcPHmSU6dO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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#将系数进行绘图\n",
    "plt.plot(range(1,9),(reg.coef_*100).tolist(),color=\"red\",label=\"LR\")\n",
    "plt.plot(range(1,9),(Ridge_.coef_*100).tolist(),color=\"orange\",label=\"Ridge\")\n",
    "plt.plot(range(1,9),(lasso_.coef_*100).tolist(),color=\"k\",label=\"Lasso\")\n",
    "plt.plot(range(1,9),[0]*8,color=\"grey\",linestyle=\"--\")\n",
    "plt.xlabel('w') #横坐标是每一个特征所对应的系数\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 288,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LassoCV\n",
    "\n",
    "#自己建立Lasso进行alpha选择的范围\n",
    "alpharange = np.logspace(-10, -2, 200,base=10)\n",
    "\n",
    "#其实是形成10为底的指数函数\n",
    "#10**(-10)到10**(-2)次方\n",
    "\n",
    "alpharange.shape\n",
    "\n",
    "Xtrain.head()\n",
    "\n",
    "lasso_ = LassoCV(alphas=alpharange #自行输入的alpha的取值范围\n",
    "                ,cv=5 #交叉验证的折数\n",
    "                ).fit(Xtrain, Ytrain)\n",
    "\n",
    "#查看被选择出来的最佳正则化系数\n",
    "lasso_.alpha_\n",
    "\n",
    "#调用所有交叉验证的结果\n",
    "lasso_.mse_path_\n",
    "\n",
    "lasso_.mse_path_.shape #返回每个alpha下的五折交叉验证结果\n",
    "\n",
    "lasso_.mse_path_.mean(axis=1) #有注意到在岭回归中我们的轴向是axis=0吗？\n",
    "\n",
    "#在岭回归当中，我们是留一验证，因此我们的交叉验证结果返回的是，每一个样本在每个alpha下的交叉验证结果\n",
    "#因此我们要求每个alpha下的交叉验证均值，就是axis=0，跨行求均值\n",
    "#而在这里，我们返回的是，每一个alpha取值下，每一折交叉验证的结果\n",
    "#因此我们要求每个alpha下的交叉验证均值，就是axis=1，跨列求均值\n",
    "\n",
    "#最佳正则化系数下获得的模型的系数结果\n",
    "lasso_.coef_\n",
    "\n",
    "lasso_.score(Xtest,Ytest)\n",
    "\n",
    "#与线性回归相比如何？\n",
    "reg = LinearRegression().fit(Xtrain,Ytrain)\n",
    "reg.score(Xtest,Ytest)\n",
    "\n",
    "#使用lassoCV自带的正则化路径长度和路径中的alpha个数来自动建立alpha选择的范围\n",
    "ls_ = LassoCV(eps=0.00001\n",
    "              ,n_alphas=300\n",
    "              ,cv=5\n",
    "                ).fit(Xtrain, Ytrain)\n",
    "\n",
    "ls_.alpha_\n",
    "\n",
    "ls_.alphas_ #查看所有自动生成的alpha取值\n",
    "\n",
    "ls_.alphas_.shape\n",
    "\n",
    "ls_.score(Xtest,Ytest)\n",
    "\n",
    "ls_.coef_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn.tree import DecisionTreeRegressor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "rnd = np.random.RandomState(42) #设置随机数种子\n",
    "X = rnd.uniform(-3, 3, size=100) #random.uniform，从输入的任意两个整数中取出size个随机数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.75275929,  2.70428584,  1.39196365,  0.59195091, -2.06388816,\n",
       "       -2.06403288, -2.65149833,  2.19705687,  0.60669007,  1.24843547,\n",
       "       -2.87649303,  2.81945911,  1.99465584, -1.72596534, -1.9090502 ,\n",
       "       -1.89957294, -1.17454654,  0.14853859, -0.40832989, -1.25262516,\n",
       "        0.67111737, -2.16303684, -1.24713211, -0.80182894, -0.26358009,\n",
       "        1.71105577, -1.80195731,  0.08540663,  0.55448741, -2.72129752,\n",
       "        0.64526911, -1.97685526, -2.60969044,  2.69331322,  2.7937922 ,\n",
       "        1.85038409, -1.17231738, -2.41396732,  1.10539816, -0.35908504,\n",
       "       -2.26777059, -0.02893854, -2.79366887,  2.45592241, -1.44732011,\n",
       "        0.97513371, -1.12973354,  0.12040813,  0.28026168, -1.89087327,\n",
       "        2.81750777,  1.65079694,  2.63699365,  2.3689641 ,  0.58739987,\n",
       "        2.53124541, -2.46904499, -1.82410283, -2.72863627, -1.04801802,\n",
       "       -0.66793626, -1.37190581,  1.97242505, -0.85948004, -1.31439294,\n",
       "        0.2561765 , -2.15445465,  1.81318188, -2.55269614,  2.92132162,\n",
       "        1.63346862, -1.80770591, -2.9668673 ,  1.89276857,  1.24114406,\n",
       "        1.37404301,  1.62762208, -2.55573209, -0.84920563, -2.30478564,\n",
       "        2.17862056,  0.73978876, -1.01461185, -2.6186499 , -1.13410607,\n",
       "       -1.04890007,  1.37763707,  0.82534483,  2.32327646, -0.16671045,\n",
       "       -2.28243452,  1.27946872,  1.56471029,  0.36766319,  1.62580308,\n",
       "       -0.03722642,  0.13639698, -0.43475389, -2.84748524, -2.35265144])"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X #作为我的横坐标"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "#生成y的思路：先使用NumPy中的函数生成一个sin函数图像，然后再人为添加噪音\n",
    "y = np.sin(X) + rnd.normal(size=len(X)) / 3 #random.normal，生成size个服从正态分布的随机数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#使用散点图观察建立的数据集是什么样子\n",
    "plt.scatter(X, y,marker='o',c='k',s=20)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100,)"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#为后续建模做准备：sklearn只接受二维以上数组作为特征矩阵的输入\n",
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = X.reshape(-1, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100, 1)"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "#使用原始数据进行建模\n",
    "LinearR = LinearRegression().fit(X, y)\n",
    "TreeR = DecisionTreeRegressor(random_state=0).fit(X, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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wQf56KOPaNGiBX/72994/PHHuf/++7nlllu4//77Abj++ut59913ufzyywHYu3cvn332mWU733zzDUuXLqV58+bMmTOHo446iq+//prDhw9z9tlnc/HFF/PNN99QWFjI999/z6+//kq3bt2YOHGit45mzZqxdOlSAC644AKeffZZTj75ZL766iumTJnCJ598wowZM/jPf/5Dp06d2Lt3LwDPPvsst99+O3a7nbKysmoa2BtvvEFBQQGrVq1i165dDBgwwCvcVq5cyZo1a+jYsSNnn302y5YtY/DgwRE9a039x37llXDLLThSUigSITM9Hefhw9gvuCDRXdPEmER78c0DZgMvhCjzuYgMr5vuJIYLLriAo446CoDu3bvjdrvZu3cva9eu5eyzzwagrKyMM888E4DFixfz6KOPUlJSwm+//UaPHj28Aurqq68O2s6IESNo3rw5YGhn3333nVc72rdvH+vXr2fp0qWMGTOGlJQUOnTowPnnn+9Xh6f+AwcO8MUXXzBmzBjvucOHDwNw9tlnM2HCBMaOHcuoUaMAOPPMM3E6nWzevJlRo0Zx8skn+9W7dOlSxo0bR2pqKscddxznnnsuX3/9Na1bt+aMM86gc+fOAGRnZ1NYWKgFVGNGBDtg79ABtmyBc8+FJUsgRmZnTfKQUAElIkuUUll13m6Emk68aNq0qfdzamoqFRUViAgXXXQRL730kl/Z0tJSpkyZwooVKzjhhBOYPn263xqgFi1aBG3H95yI8PTTTzNs2DC/MosWLQrZV08dlZWVtGnThoKCgmplnn32Wb766isWLVpEdnY2BQUFXHvttQwcOJBFixYxbNgwnn/+eYYOHerXn2BYPR9NI6ay0vibYs5QpKb6H9c0GOrDHNSZSqlVSqn3lVI9ghVSSuUqpVYopVbs3LmzLvsXFwYNGsSyZcv4+eefAcON9qeffvIKo/bt23PgwIGInS2GDRvGM888Q3l5OQA//fQTBw8eZPDgwSxcuJDKykp27NjBp59+anl969at6dKlC6+99hpgCJhVq1YBsGHDBgYOHMiMGTNo3749mzZtYuPGjXTt2pXbbruNESNG8N133/nVd8455/DKK69w5MgRdu7cyZIlSzjjjDMiujdNA8fzMuNZ/+YRUFqDanAku4D6FrCJSB/gaeDNYAVFZI6InC4ipx9zTI15sJKeY445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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#放置画布\n",
    "fig, ax1 = plt.subplots(1)\n",
    "\n",
    "#创建测试数据：一系列分布在横坐标上的点\n",
    "line = np.linspace(-3, 3, 1000, endpoint=False).reshape(-1, 1)\n",
    "\n",
    "#将测试数据带入predict接口，获得模型的拟合效果并进行绘制\n",
    "ax1.plot(line, LinearR.predict(line), linewidth=2, color='green',\n",
    "         label=\"linear regression\")\n",
    "ax1.plot(line, TreeR.predict(line), linewidth=2, color='red',\n",
    "         label=\"decision tree\")\n",
    "\n",
    "#将原数据上的拟合绘制在图像上\n",
    "ax1.plot(X[:, 0], y, 'o', c='k')\n",
    "\n",
    "#其他图形选项\n",
    "ax1.legend(loc=\"best\")\n",
    "ax1.set_ylabel(\"Regression output\")\n",
    "ax1.set_xlabel(\"Input feature\")\n",
    "ax1.set_title(\"Result before discretization\")\n",
    "plt.tight_layout()\n",
    "plt.show()\n",
    "\n",
    "#从这个图像来看，可以得出什么结果？"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import KBinsDiscretizer\n",
    "\n",
    "#将数据分箱\n",
    "enc = KBinsDiscretizer(n_bins=10 #分几类？\n",
    "                       ,encode=\"onehot\") #ordinal\n",
    "X_binned = enc.fit_transform(X)\n",
    "#encode模式\"onehot\"：使用做哑变量方式做离散化\n",
    "#之后返回一个稀疏矩阵(m,n_bins)，每一列是一个分好的类别\n",
    "#对每一个样本而言，它包含的分类（箱子）中它表示为1，其余分类中它表示为0\n",
    "\n",
    "X.shape\n",
    "\n",
    "X_binned\n",
    "\n",
    "#使用pandas打开稀疏矩阵\n",
    "import pandas as pd\n",
    "pd.DataFrame(X_binned.toarray()).head()\n",
    "\n",
    "#我们将使用分箱后的数据来训练模型，在sklearn中，测试集和训练集的结构必须保持一致，否则报错\n",
    "LinearR_ = LinearRegression().fit(X_binned, y)\n",
    "\n",
    "LinearR_.predict(line) #line作为测试集\n",
    "\n",
    "line.shape #测试\n",
    "\n",
    "X_binned.shape #训练\n",
    "\n",
    "#因此我们需要创建分箱后的测试集：按照已经建好的分箱模型将line分箱\n",
    "line_binned = enc.transform(line)\n",
    "\n",
    "line_binned.shape #分箱后的数据是无法进行绘图的\n",
    "\n",
    "line_binned\n",
    "\n",
    "LinearR_.predict(line_binned).shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-2.9668673 , -2.55299973, -2.0639171 , -1.3945301 , -1.02797432,\n",
       "       -0.21514527,  0.44239288,  1.14612193,  1.63693428,  2.32784522,\n",
       "        2.92132162])"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "enc.bin_edges_[0] #分出的箱子的上限和下限"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0.0, 1.0]"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "[*plt.gca().get_ylim()]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#准备数据\n",
    "enc = KBinsDiscretizer(n_bins=10,encode=\"onehot\")\n",
    "X_binned = enc.fit_transform(X)\n",
    "line_binned = enc.transform(line)\n",
    "\n",
    "#将两张图像绘制在一起，布置画布\n",
    "fig, (ax1, ax2) = plt.subplots(ncols=2\n",
    "                               , sharey=True #让两张图共享y轴上的刻度\n",
    "                               , figsize=(10, 4))\n",
    "\n",
    "#在图1中布置在原始数据上建模的结果\n",
    "ax1.plot(line, LinearR.predict(line), linewidth=2, color='green',\n",
    "         label=\"linear regression\")\n",
    "ax1.plot(line, TreeR.predict(line), linewidth=2, color='red',\n",
    "         label=\"decision tree\")\n",
    "ax1.plot(X[:, 0], y, 'o', c='k')\n",
    "ax1.legend(loc=\"best\")\n",
    "ax1.set_ylabel(\"Regression output\")\n",
    "ax1.set_xlabel(\"Input feature\")\n",
    "ax1.set_title(\"Result before discretization\")\n",
    "\n",
    "#使用分箱数据进行建模\n",
    "LinearR_ = LinearRegression().fit(X_binned, y)\n",
    "TreeR_ = DecisionTreeRegressor(random_state=0).fit(X_binned, y)\n",
    "\n",
    "#进行预测，在图2中布置在分箱数据上进行预测的结果\n",
    "ax2.plot(line #横坐标\n",
    "         , LinearR_.predict(line_binned) #分箱后的特征矩阵的结果\n",
    "         , linewidth=2\n",
    "         , color='green'\n",
    "         , linestyle='-'\n",
    "         , label='linear regression')\n",
    "\n",
    "ax2.plot(line, TreeR_.predict(line_binned), linewidth=2, color='red',\n",
    "         linestyle=':', label='decision tree')\n",
    "\n",
    "#绘制和箱宽一致的竖线\n",
    "ax2.vlines(enc.bin_edges_[0] #x轴\n",
    "           , *plt.gca().get_ylim() #y轴的上限和下限\n",
    "           , linewidth=1\n",
    "           , alpha=.2)\n",
    "\n",
    "#将原始数据分布放置在图像上\n",
    "ax2.plot(X[:, 0], y, 'o', c='k')\n",
    "\n",
    "#其他绘图设定\n",
    "ax2.legend(loc=\"best\")\n",
    "ax2.set_xlabel(\"Input feature\")\n",
    "ax2.set_title(\"Result after discretization\")\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9590978882491229\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "enc = KBinsDiscretizer(n_bins=15,encode=\"onehot\")\n",
    "X_binned = enc.fit_transform(X)\n",
    "line_binned = enc.transform(line)\n",
    "\n",
    "fig, ax2 = plt.subplots(1,figsize=(5,4))\n",
    "\n",
    "LinearR_ = LinearRegression().fit(X_binned, y)\n",
    "print(LinearR_.score(line_binned,np.sin(line)))\n",
    "TreeR_ = DecisionTreeRegressor(random_state=0).fit(X_binned, y)\n",
    "\n",
    "ax2.plot(line #横坐标\n",
    "         , LinearR_.predict(line_binned) #分箱后的特征矩阵的结果\n",
    "         , linewidth=2\n",
    "         , color='green'\n",
    "         , linestyle='-'\n",
    "         , label='linear regression')\n",
    "ax2.plot(line, TreeR_.predict(line_binned), linewidth=2, color='red',\n",
    "         linestyle=':', label='decision tree')\n",
    "ax2.vlines(enc.bin_edges_[0], *plt.gca().get_ylim(), linewidth=1, alpha=.2)\n",
    "ax2.plot(X[:, 0], y, 'o', c='k')\n",
    "ax2.legend(loc=\"best\")\n",
    "ax2.set_xlabel(\"Input feature\")\n",
    "ax2.set_title(\"Result after discretization\")\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [],
   "source": [
    "#怎样选取最优的箱子?\n",
    "from sklearn.model_selection import cross_val_score as CVS\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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VqxYQWxsLDVq1GDevHkAnD59mvLly/P++++zdOlSwgrR4Ih6FTErixfDM8/YXrbVqqUL/NOnT3P33Xczf/58HnroIcaOHeu+1SHYoVNnz4YxY+COO/K58EoVMpkckeeHRYsWsWjRIq6+2l56jIuLY9euXbRp04ZnnnmGYcOG0bVrV9qkyYHCREM/M598Yi/Y/uMf9qYmaezcuZPu3buzZ88ePv7449QjZiZr2RKGDYPHH8+HAiulckNEGD58OA9lcOOi9evXM3/+fIYPH07Hjh155ZVXMniHgk8HXMuI02l7yz7wALRrB6tWQZ06qRZZsGABLVu25Pjx4/z888/pA//ECfuzXz8YlW7UCqVUAVG2bFnOulrWderUiU8++YS4uDgA/v77b44ePUpMTAylSpXi3nvv5ZlnnmHDhg3p1i0sNPQzMmqUvXv94MF2LB2PYY5FhHfeeYfbbruNevXqERUVxY033ph6/RUroF49WyWklCrQKleuTOvWrWnWrBk//fQTd999N9dffz3Nmzend+/enD17li1bttCiRQvCw8N58803eemllwCIjIykc+fOtGvXzs9b4T1jr8EWHBERERIVFeXfQpw4Ye9fGRmZqoXOhQsXGDx4MNOnT+fOO+9k6tSplE7b1n7HDnuxtlo1e4ZQuXI+F16pwmXHjh00btzY38UoVDL6nRlj1rs6wmZKj/ST7dwJAwbYuvtKlWxdvkfgR0dH06ZNG6ZPn84bb7zBV199lT7w//4bOne2NzRfsEADXylV4OiFXIDly6FnT3sjk3374MorU83+9ddfueOOOzh//jzff/893bplMDr00aMQEWF73S5fbodoUEqpAkaP9D//HDp0sDcxWbMmXeBPmTKFm266iTJlyrBmzZqMAx+galV4+GFYvdr2vFVKqQIosEN/7Fi47z7b9n7VqlRH54mJifzrX//iwQcf5KabbmLt2rU0adIk9fqnT8Pdd8Pvv9vXr74KzQt/XzSlVNEV2KF/8812/PsFC6BixZTJx48fp1OnTnzwwQc89dRTzJ8/n0qVKqVed/Nme0T/9df25ilKKVUIBF7oHz9ue8eKQNOm9k5XHj1ot2zZwrXXXsuvv/7Kp59+ynvvvUdI2uGPp061wzFcuADLltkLwEqpQmvs2LE0btyYe+65J9Plkm91un//fpo1a5bl+w4cOJBZs2Zlusy0adOIiUk7cHHeCawLubt22RuX/PUX3Hpruvr7b7/9lvvuu49y5cqxfPny1Dc+SfbVV/a+tu3bw5df2rp8pVSh9tFHH7FgwYIc34IwN6ZNm0azZs2o4XFPjrwUOEf6v/xij85PnLDj6XgEvtPpZMSIEfTq1YtmzZoRFRWVPvCdTvvzjjvg449h0SINfKWKgIcffpi9e/fSrVs3Ro8ezYgRI3j33XdT5jdr1oz9+/d79V4iwtChQ2nSpAm33XYbR4+67xw7cuRIrr32Wpo1a0ZkZCQiwqxZs4iKiuKee+4hPDycCxcuZLicLwXGkf6MGbYKpl4928P2iitSZsXFxXHfffcxe/ZsBgwYwPjx4ylRokTq9efMgZdftjuLsDDbSkcp5XNPPPEEmzb5dmjl8PBwxoy59EBu48ePZ+HChSmjZaa6D0Y2zZ49m507d7JlyxaOHDlCkyZNGDRoEABDhw5NGa+nf//+/PDDD/Tu3ZsPP/yQd999l4iIiEsud/vtt+e4TGkFxpF+qVLQurVtTukR+Hv37uX666/n+++/Z/To0UydOjV14CclwfPPQ/fu9raGhexmCUqp/LVixQr69etHcHAwNWrUoL3H/TOWLl1Ky5Ytad68OUuWLGHbtm0Zvoe3y+VU0T3Sv3gRVq60de/dusHtt6fqYbtkyRLuvPNORISFCxfSoUOH1OsfPgx9+9qOVg89ZC/+pj0DUEr5VGZH5PklJCQEZ3J1LhAfH5+t9TO6cXl8fDxDhgwhKiqK2rVrM2LEiAzf19vlcqNoHumfPGkv1HbsCHv22GmuL0JE+OCDD+jYsSPVq1dn7dq16QMf7Dj4a9fCZ5/B+PEa+EoFiHr16qWMorlhwwb27dvn9bpt27ZlxowZOBwODh06lHI3reTgDgsLIy4uLlWLHs+ROjNbzleK3pH+3r22hc6ePTBtGlx+ecqshIQEHn30UaZMmUK3bt34/PPPKVeunHtdEYiLs/e9HTPGVu1oZyulAkqvXr347LPPCA8P59prr6VRo0Zer9uzZ0+WLFlC8+bNadSoUcoIvBUqVGDw4ME0b96cevXqce2116asM3DgQB5++GFKlizJ6tWrL7mcrxStUTZXr7b17w6HvVtV27Ypsw4fPswdd9zB6tWrefnllxkxYgRBQR4nOqdPw8CBth3/kiW2Dl8pled0lM3sy80om0Ur2VassGPfz5sHHnvnqKgoevTowcmTJ5k5cyZ33nln6vU2b4ZeveDAAXjnHQgOzueCK6VU/ihadfrPPQfr16cK/OnTp9OmTRtCQkJYtWpV+sCfNi1179onnkh1wVcppYqSohX6xoCrjt7hcPDcc89x77330rJlS9atW0d4eHjq5c+fh9dftzc92bjRNutUSqkirGhV77icOnWKfv36sXDhQoYMGcKYMWMIDQ11L7B/P1x2mW2/v2wZ1KihVTpKqYBQtI70gT/++IOWLVvy888/M2HCBMaNG5c68OfMgfBweOEF+7p2bQ18pVTAKFKhP2/ePFq2bMnJkydZsmQJkZGR7plJSTB8uG3dc/nldkhlpZQKMF6FvjHmVmPMTmPMbmPM85dYpo8xZrsxZpsx5guP6QOMMbtcjzwbg/iPP/6gW7duXH755URFRdGmTRv3zMOH7d2xRo2yvWvT3DBFKaUCRZZ1+saYYGAc0AGIBtYZY+aIyHaPZRoCw4HWInLSGFPVNb0S8CoQAQiw3rXuSV9vyJVXXsn06dPp1q0bpUqVSj3z5EnYvt32ru3f39cfrZRShYY3R/otgN0isldELgIzgO5plhkMjEsOcxFJHk+0E/CTiJxwzfsJuNU3RU+vb9++7sAXse31RaBxY3vDcw18pZSPiEiqMXoKC29a79QEDnq8jgbS3l2kEYAxZhUQDIwQkYWXWLdmjkvrrdOn4f77ba/cBQvsODxpj/6VUgXTTTeln9anDwwZYptZd+mSfv7AgfZx7Bj07p163rJlmX7csGHDqFu3LkOGDAFgxIgRGGNYsWIFJ0+eJDExkTfeeIPu3buzf/9+OnfuTLt27Vi9ejXfffcddevWzclW+o03R/oZ9VRKO3ZDCNAQuAnoB0w2xlTwcl2MMZHGmChjTFRsbKwXRcrE5s0QEQFz58L770OnTrl7P6VUkda3b1+++uqrlNczZ87k/vvvZ/bs2WzYsIGlS5fy9NNPp9zMZOfOndx3331s3Lix0AU+eHekHw3U9nhdC0h7Q8doYI2IJAL7jDE7sTuBaOyOwHPdZWk/QEQmAhPBjr3jZdnT++ILeOABqFTJ7t21s5VShU9mR+bJfWsuJSwsyyP7tK6++mqOHj1KTEwMsbGxVKxYkcsuu4wnn3ySFStWEBQUxN9//82RI0cAqFu3Ltddd122PqMg8Sb01wENjTH1gb+BvsDdaZb5DnuEP80YE4at7tkL7AHeMsZUdC3XEXvBN2+UK2eD/osv9FaGSimv9e7dm1mzZnH48GH69u3L9OnTiY2NZf369YSGhlKvXr2UYY9Lly7t59LmTpahLyJJxpihwI/Y+vpPRGSbMWYkECUic1zzOhpjtgMO4FkROQ5gjHkdu+MAGCkiJ/JiQwDo2tUOq6xj5yilsqFv374MHjyYY8eOsXz5cmbOnEnVqlUJDQ1l6dKlHDhwwN9F9BmvhmEQkfnA/DTTXvF4LsBTrkfadT8BPsldMbNBA18plU1Nmzbl7Nmz1KxZk8suu4x77rmH22+/nYiICMLDw7nyyiv9XUSfKZJj7yilVHZt2bIl5XlYWBirV6/OcLmtW7fmV5HyRJEahkEppVTmNPSVUiqAaOgrpfyuoN22tSDL7e9KQ18p5VclSpTg+PHjGvxeEBGOH9QCQWUAAAPDSURBVD9OiRIlcvweeiFXKeVXtWrVIjo6mlz3xg8QJUqUoFatWjleX0NfKeVXoaGh1NehzvONVu8opVQA0dBXSqkAoqGvlFIBxBS0K+bGmFigMA90EQYc83ch8khR3TbdrsKnqG5bbrarrohUyWqhAhf6hZ0xJkpEIvxdjrxQVLdNt6vwKarblh/bpdU7SikVQDT0lVIqgGjo+95EfxcgDxXVbdPtKnyK6rbl+XZpnb5SSgUQPdJXSqkAoqGvlFIBREPfh4wx+40xW4wxm4wxUf4uT04ZYz4xxhw1xmz1mFbJGPOTMWaX62fFzN6joLrEto0wxvzt+t42GWO6+LOMOWGMqW2MWWqM2WGM2WaMedw1vVB/b5lsV1H4zkoYY9YaYza7tu011/T6xpjfXN/ZV8aYYj79XK3T9x1jzH4gQkQKdacRY0xbIA74TESauab9BzghIqOMMc8DFUVkmD/LmROX2LYRQJyIvOvPsuWGMeYy4DIR2WCMKQusB3oAAynE31sm29WHwv+dGaC0iMQZY0KBlcDj2HuNfysiM4wx44HNIvKxrz5Xj/RVOiKyAjiRZnJ34FPX80+x/3iFziW2rdATkUMissH1/CywA6hJIf/eMtmuQk+sONfLUNdDgPbALNd0n39nGvq+JcAiY8x6Y0ykvwvjY9VE5BDYf0Sgqp/L42tDjTG/u6p/ClUVSFrGmHrA1cBvFKHvLc12QRH4zowxwcaYTcBR4CdgD3BKRJJci0Tj452chr5vtRaR/wM6A4+6qhJUwfcxcDkQDhwC3vNvcXLOGFMG+AZ4QkTO+Ls8vpLBdhWJ70xEHCISDtQCWgCNM1rMl5+poe9DIhLj+nkUmI39EouKI6761eR61qN+Lo/PiMgR1z+fE5hEIf3eXPXC3wDTReRb1+RC/71ltF1F5TtLJiKngGXAdUAFY0zyDa5qATG+/CwNfR8xxpR2XWjCGFMa6AhszXytQmUOMMD1fADwvR/L4lPJoejSk0L4vbkuCk4BdojI+x6zCvX3dqntKiLfWRVjTAXX85LALdhrFkuB3q7FfP6daesdHzHGNMAe3YO9DeUXIvKmH4uUY8aYL4GbsMO8HgFeBb4DZgJ1gL+AO0Wk0F0QvcS23YStJhBgP/BQcj14YWGMuQH4BdgCOF2TX8DWfxfa7y2T7epH4f/O/om9UBuMPQCfKSIjXVkyA6gEbATuFZEEn32uhr5SSgUOrd5RSqkAoqGvlFIBRENfKaUCiIa+UkoFEA19pZQKIBr6SikVQDT0lVIqgPw/hp/OHXvvptoAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "pred,score,var = [], [], []\n",
    "binsrange = [2,5,10,15,20,30]\n",
    "for i in binsrange:\n",
    "    #实例化分箱类\n",
    "    enc = KBinsDiscretizer(n_bins=i,encode=\"onehot\")\n",
    "    #转换数据\n",
    "    X_binned = enc.fit_transform(X)\n",
    "    line_binned = enc.transform(line)\n",
    "    #建立模型\n",
    "    LinearR_ = LinearRegression()\n",
    "    #全数据集上的交叉验证\n",
    "    cvresult = CVS(LinearR_,X_binned,y,cv=5)\n",
    "    score.append(cvresult.mean())\n",
    "    var.append(cvresult.var())\n",
    "    #测试数据集上的打分结果\n",
    "    pred.append(LinearR_.fit(X_binned,y).score(line_binned,np.sin(line)))\n",
    "#绘制图像\n",
    "plt.figure(figsize=(6,5))\n",
    "plt.plot(binsrange,pred,c=\"orange\",label=\"test\")\n",
    "plt.plot(binsrange,score,c=\"k\",label=\"full data\")\n",
    "plt.plot(binsrange,score+np.array(var)*0.5,c=\"red\",linestyle=\"--\",label = \"var\")\n",
    "plt.plot(binsrange,score-np.array(var)*0.5,c=\"red\",linestyle=\"--\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1],\n",
       "       [2],\n",
       "       [3]])"
      ]
     },
     "execution_count": 125,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#如果原始数据是一维的\n",
    "X = np.arange(1,4).reshape(-1,1)\n",
    "X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [],
   "source": [
    "#二次多项式，参数degree控制多项式的次方\n",
    "poly = PolynomialFeatures(degree=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [],
   "source": [
    "#接口transform直接调用\n",
    "X_ = poly.fit_transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 1., 1.],\n",
       "       [1., 2., 4.],\n",
       "       [1., 3., 9.]])"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3, 3)"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.,  1.,  1.,  1.],\n",
       "       [ 1.,  2.,  4.,  8.],\n",
       "       [ 1.,  3.,  9., 27.]])"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#三次多项式\n",
    "PolynomialFeatures(degree=3).fit_transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.,  1.,  1.],\n",
       "       [ 2.,  4.,  8.],\n",
       "       [ 3.,  9., 27.]])"
      ]
     },
     "execution_count": 126,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#三次多项式，不带与截距项相乘的x0\n",
    "PolynomialFeatures(degree=3,include_bias=False).fit_transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {},
   "outputs": [],
   "source": [
    "#为什么我们会希望不生成与截距相乘的x0呢？\n",
    "#对于多项式回归来说，我们已经为线性回归准备好了x0，但是线性回归并不知道\n",
    "xxx = PolynomialFeatures(degree=3).fit_transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3, 4)"
      ]
     },
     "execution_count": 127,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xxx.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.49671415, -0.1382643 ,  0.64768854])"
      ]
     },
     "execution_count": 129,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rnd = np.random.RandomState(42) #设置随机数种子\n",
    "y = rnd.randn(3)\n",
    "\n",
    "y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.36002321e-15, -3.51045297e-01, -6.06987134e-01,  2.19575463e-01])"
      ]
     },
     "execution_count": 130,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#生成了多少个系数？\n",
    "LinearRegression().fit(xxx,y).coef_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.2351711202036895"
      ]
     },
     "execution_count": 131,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#查看截距\n",
    "LinearRegression().fit(xxx,y).intercept_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.00596411,  0.06916756, -0.83619415,  0.25777663])"
      ]
     },
     "execution_count": 133,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#发现问题了吗？线性回归并没有把多项式生成的x0当作是截距项\n",
    "#所以我们可以选择：关闭多项式回归中的include_bias\n",
    "#也可以选择：关闭线性回归中的fit_intercept\n",
    "\n",
    "#生成了多少个系数？\n",
    "LinearRegression(fit_intercept=False).fit(xxx,y).coef_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.0"
      ]
     },
     "execution_count": 134,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#查看截距\n",
    "LinearRegression(fit_intercept=False).fit(xxx,y).intercept_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 1],\n",
       "       [2, 3],\n",
       "       [4, 5]])"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = np.arange(6).reshape(3, 2)\n",
    "X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.,  0.,  1.,  0.,  0.,  1.],\n",
       "       [ 1.,  2.,  3.,  4.,  6.,  9.],\n",
       "       [ 1.,  4.,  5., 16., 20., 25.]])"
      ]
     },
     "execution_count": 136,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#尝试二次多项式\n",
    "PolynomialFeatures(degree=2).fit_transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[  1.,   0.,   1.,   0.,   0.,   1.,   0.,   0.,   0.,   1.],\n",
       "       [  1.,   2.,   3.,   4.,   6.,   9.,   8.,  12.,  18.,  27.],\n",
       "       [  1.,   4.,   5.,  16.,  20.,  25.,  64.,  80., 100., 125.]])"
      ]
     },
     "execution_count": 137,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#尝试三次多项式\n",
    "PolynomialFeatures(degree=3).fit_transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.,  0.,  1.,  0.,  0.,  1.],\n",
       "       [ 1.,  2.,  3.,  4.,  6.,  9.],\n",
       "       [ 1.,  4.,  5., 16., 20., 25.]])"
      ]
     },
     "execution_count": 138,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "PolynomialFeatures(degree=2).fit_transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.,  0.,  1.,  0.],\n",
       "       [ 1.,  2.,  3.,  6.],\n",
       "       [ 1.,  4.,  5., 20.]])"
      ]
     },
     "execution_count": 139,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "PolynomialFeatures(degree=2,interaction_only=True).fit_transform(X)\n",
    "#对比之下，当interaction_only为True的时候，只生成交互项"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],\n",
       "       [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]])"
      ]
     },
     "execution_count": 144,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#更高维度的原始特征矩阵\n",
    "X = np.arange(20).reshape(2, 10)\n",
    "X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2, 66)"
      ]
     },
     "execution_count": 146,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "PolynomialFeatures(degree=2).fit_transform(X).shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2, 286)"
      ]
     },
     "execution_count": 147,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "PolynomialFeatures(degree=3).fit_transform(X).shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2, 30045015)"
      ]
     },
     "execution_count": 148,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_ = PolynomialFeatures(degree=20).fit_transform(X)\n",
    "\n",
    "X_.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 159,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import PolynomialFeatures as PF\n",
    "from sklearn.linear_model import LinearRegression\n",
    "import numpy as np\n",
    "\n",
    "rnd = np.random.RandomState(42) #设置随机数种子\n",
    "X = rnd.uniform(-3, 3, size=100)\n",
    "y = np.sin(X) + rnd.normal(size=len(X)) / 3\n",
    "\n",
    "#将X升维，准备好放入sklearn中\n",
    "X = X.reshape(-1,1)\n",
    "\n",
    "#创建测试数据，均匀分布在训练集X的取值范围内的一千个点\n",
    "line = np.linspace(-3, 3, 1000, endpoint=False).reshape(-1, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 160,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.5361526059318595"
      ]
     },
     "execution_count": 160,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#原始特征矩阵的拟合结果\n",
    "LinearR = LinearRegression().fit(X, y)\n",
    "#对训练数据的拟合\n",
    "LinearR.score(X,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 161,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6800102369793312"
      ]
     },
     "execution_count": 161,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#对测试数据的拟合\n",
    "LinearR.score(line,np.sin(line))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8561679370344799"
      ]
     },
     "execution_count": 164,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#多项式拟合，设定高次项\n",
    "d=5\n",
    "\n",
    "#进行高次项转换\n",
    "poly = PF(degree=d)\n",
    "X_ = poly.fit_transform(X)\n",
    "line_ = poly.transform(line)\n",
    "\n",
    "#训练数据的拟合\n",
    "LinearR_ = LinearRegression().fit(X_, y)\n",
    "LinearR_.score(X_,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9868904451787983"
      ]
     },
     "execution_count": 165,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#测试数据的拟合\n",
    "LinearR_.score(line_,np.sin(line))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 171,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvDW2N/gAAIABJREFUeJzsnXd4VNX2v9+dRhI6QemZoKC0QKQr1UYXAUXFiBCUqNjuzyvXwlflIrnWKxYuInoJaiIoghUUxYs0UUEICIggmFAlgAYCAVJm/f44k2ESppwk05Ls93n2k5lT9t7nzGR/Zq+9zlpKRNBoNBqNJtgICXQHNBqNRqNxhhYojUaj0QQlWqA0Go1GE5RogdJoNBpNUKIFSqPRaDRBiRYojUaj0QQlWqA0blFK9VFK/RroflQFlFKxSqmTSqnQQPelNEqpqUqpNNvroO2nv1FKjVdKrQl0P6orWqA0ACilMpVS15TeLiKrReTSQPSpNLZBtMA2eOYopb5TSl0e6H6ZRUT2ikgtESkKdF/cUVn6qan6aIHSBCVKqTAXu94XkVpAQ2AFsNDP7VdqlEHA/u/1rExTFrRAadyilOqvlNrv8D5TKfWwUmqLUuq4Uup9pVSkw/5hSqkMhxlOR4d9jyqldiulcpVS25VSIx32jVdKrVVKzVBK/QlMddcvESkE0oFmSqkLTLbfWSm1ydb+Qlvfpztep1LqEaXUH0CqifoeUUodsNX3q1Lqatv27kqpDUqpE0qpw0qpl2zb45RSUix+SqmmSqlPlVJ/KqV+U0pNdKh7qlLqA6XUO7b6tymlurr5nK5QSq23fSbrlVJXOOz7VimVopRaC+QBFymlWiqlVtrq/hpD8IuPL93Pb5VST9s+n1yl1FdKKcfjFyql/rC1vUop1d5h3zyl1OtKqaVKqVPAQ7Z7EuZwzA1KqQwn19TTVm+ow7aRSqkt7u6zk3qKP9vHlVJHbd/hRIf9dW33+YhSKksp9X/ORFwp9R+l1L9LbftMKfU3V5+LpoKIiC66AGQC1zjZ3h/YX+q4H4GmQAPgF+Bu277OQDbQAwgFxtmOr2HbP9p2XghwM3AKaGLbNx4oBO4HwoAoJ32ZCqTZXkcAzwJHgTBP7duOzwIeBMKBUUA+MN3hOguB52zHR3mo71JgH9DUdn4ccLHt9TpgrO11LaCnwzHi0N+VwCwgEkgAjgBXO1zrGWCIre1ngO9dfHYNgL+AsbZ7N8b2Psa2/1tgL9Detj/c1seXbNfSF8h1uLel+/ktsBu4xHZfvgWedWh/AlDbVtfLQIbDvnnAcaAXxuceCWwHBjsc8xHwdxfXthu41uH9QuBRd/fZxXe40OF6+2F89y617X8H+MR2DXHATuAOh+/lGtvr7sBBIMT2viGG4DcK9P9vVS0B74AuwVEom0Dd5vD+eWC27fXrwNOlzv8V6OeizQzgetvr8cBeD32ciiEqOUARcAzo77DfZfu2QfgAoBz2raGkQOUDkSbra4UhXtcA4aWOWQX8E2hYansctoEfaGG7htoO+58B5jlc63KHfe2A0y7uy1jgx1Lb1gHjba+/BaY57Iu1Ddg1Hba9h3uB+j+HYycBX7roSz3buXVt7+cB75Q65hEg3fa6AcYg38RFfdOBubbXtTGExeLuPrv4Dpe+3g+AJzDE/yzQzmHfXcC3Dt/LNQ77fsEmmMB9wFJ//69Wp6JNfJry8IfD6zyMX68AFuDvNnNYjlIqB2MgbgqglLrdwVyWA3TAwbSEMSPxxAciUg9oBGwFujjsc9d+U+CA2EYWF+0dEZEzZuoTkd+Av2EISbZSaoFSqqntvDswZhs7bOa2YU6uoynwp4jkOmzLApo5vC99nyOV87WxprZzHSldl+O1NgX+EpFTpY53h9PPXCkVqpR6Vhmm2xMYP2DA/eeaBlynlKoF3ASsFpFDLtp9DxillKqBMevdKCLFfTVzn4txdr1Nbf0snl077nO8d468Ddxme30b8K6bNjUVRAuUxpvsA1JEpJ5DiRaR+UopC/Amxq/OGJvIbAWUw/mmQ+uLyFGMX7pTlVJNPLUPHMJYr3Jsr0Xpas1ej60P74lIbwwhEwzzICKyS0TGABfatn2olKpZqu6DQAOlVG2HbbEYs7yyctDWB0dK1+V4bYeA+qX6FFuOdgFuBa7HmEnWxZh9gZvPVUQOYMzwRmLM/lwO8iKyHUMwBtvaes9hn5n7XIyz6z2IYSIuoOT9c/c5pAHXK6U6AW2Bj131XVNxtEBpHAlXSkU6lLJ6sr0J3K2U6qEMaiqlhtoG4ZoYA9URAKVUEsYMqtyIyA5gGfAPE+2vwzCp3aeUClNKXY+xplCu61FKXaqUusr2y/4McNpWP0qp25RSF4iIFcMcSfE+h77vA74DnrHd644YM4L0ctyKpcAlSqlbbdd2M4ZJ8HNnB9tmIBuAfyqlIpRSvYHrytEuGGa3sxjm1mjgXybPewfjc4vHWINyx3vAAxhmWrvXppn7XIri6+0DDAMWiuFK/wGQYvtcLcBDGEJ0HiKyH1iPIaqLROS0h75rKoAWKI0jSzEG2uIytSwni8gGYCIwE2OR/jcMG37xL+F/YwjFYYyBaa0X+vwCkKyUutBD+/kYJqI7MAaz2zAG8LPluR6MxfZiJ40/MH7FP27bNwjYppQ6CbwC3FLKdFjMGIwZx0GMQfopEfm6jNePiBzDGHD/jiEU/wCG2WaZrrgVw/njT+ApDMEoD+9gzHAOYDg/fG/yvI8wZi0flTK9OWM+xjrS/0pdk9n7DMZn9BfGvU7HcOzZYdt3P8ba1h6Mdcn3gLlu+vM2xvdXm/d8jCppktdoqg9KqR8wHDxSA92X6ohSajdwl4gs93E7/TEcQJp7qb6+GDOsONvsTeMj9AxKU21QSvVTSjW2mcHGAR2BLwPdr+qIUuoGDJPv/wLdl7KglArHeFThLS1OvqdKPi2v0bjgUoz1hloYz9fc6MZ7TOMjlFLfYqyRja1Mg7xSqi3G2t1mICnA3akWaBOfRqPRaIISbeLTaDQaTVBSJU18DRs2lLi4uEB3Q6PRaDRO+Omnn46KyAWejquSAhUXF8eGDRsC3Q2NRqPROEEp5SlyCaBNfBqNRqMJUrRAaTQajSYo0QKl0Wg0mqCkSq5BOaOgoID9+/dz5oyrSCgajXsiIyNp3rw54eHhge6KRlMtqDYCtX//fmrXrk1cXBwlA1prNJ4REY4dO8b+/ftp2bJloLuj0VQLqo2J78yZM8TExGhx0pQLpRQxMTF6Bh4kpKenExcXR0hICHFxcaSnlycIvCbYqTYzKECLk6ZC6O9PcJCenk5ycjJ5eXkAZGVlkZycDEBiYmIgu6bxMtVmBqXRaKoGU6ZMsYtTMXl5eUyZMiVAPdL4Ci1QfqRWLSMz+sGDB7nxxhsD3Jvg4Iorrgh0FzSVjL1795Zpu6byogUqADRt2pQPP/zQp20UFhaWa59ZiorcJS41z3fffeeVejTVh9hY59npXW3XVF60QAWAzMxMOnQwsp3PmzePUaNGMWjQIFq3bs0//vEP+3FfffUVl19+OZ07d2b06NGcPHkSgGnTptGtWzc6dOhAcnIyxRHp+/fvz+OPP06/fv145ZVXSrQ5depUkpOTGTBgALfffjtFRUVMnjyZbt260bFjR9544w0ArFYrkyZNon379gwbNowhQ4bYxTQuLo5p06bRu3dvFi5cyO7duxk0aBBdunShT58+7NhhJChduHAhHTp0oFOnTvTt2xeAbdu20b17dxISEujYsSO7du0Czs0qRYTJkyfToUMH4uPjef/99wH49ttv6d+/PzfeeCNt2rQhMTERHYG/epOSkkJ0dHSJbdHR0aSkpASoRxpfEVAnCaXUXIxU1dki0sHJ/v7AJ8Dvtk2LRWRahdv9p28Wu+Wp8g2cGRkZbNq0iRo1anDppZdy//33ExUVxfTp01m+fDk1a9bkueee46WXXuLJJ5/kvvvu48knnwRg7NixfP7551x33XUA5OTksHLlSqft/PTTT6xZs4aoqCjmzJlD3bp1Wb9+PWfPnqVXr14MGDCAn376iczMTH7++Weys7Np27YtEyZMsNcRGRnJmjVrALj66quZPXs2rVu35ocffmDSpEn873//Y9q0aSxbtoxmzZqRk5MDwOzZs3nwwQdJTEwkPz//vBnY4sWLycjIYPPmzRw9epRu3brZxW3Tpk1s27aNpk2b0qtXL9auXUvv3r3Lda81lZ9iR4gpU6awd+9eYmNjSUlJ0Q4SVZBAe/HNA2YC77g5ZrWIDPNPdwLD1VdfTd26dQFo164dWVlZ5OTksH37dnr16gVAfn4+l19+OQArVqzg+eefJy8vjz///JP27dvbBermm2922c7w4cOJiooCjNnZli1b7LOj48ePs2vXLtasWcPo0aMJCQmhcePGXHnllSXqKK7/5MmTfPfdd4wePdq+7+zZswD06tWL8ePHc9NNNzFq1CgALr/8clJSUti/fz+jRo2idevWJepds2YNY8aMITQ0lEaNGtGvXz/Wr19PnTp16N69O82bG9m6ExISyMzM1AJVzUlMTNSCVA0IqECJyCqlVJzf2y3nTMdX1KhRw/46NDSUwsJCRIRrr72W+fPnlzj2zJkzTJo0iQ0bNtCiRQumTp1a4tmcmjVrumzHcZ+I8NprrzFw4MASxyxZssRtX4vrsFqt1KtXj4yMjPOOmT17Nj/88ANLliwhISGBjIwMbr31Vnr06MGSJUsYOHAgb731FldddVWJ/rjC2f3RaDRVn8qwBnW5UmqzUuoLpVR7VwcppZKVUhuUUhuOHDniz/75hJ49e7J27Vp+++03wHCj3blzp12MGjZsyMmTJ8vtbDFw4EBef/11CgoKANi5cyenTp2id+/eLFq0CKvVyuHDh/n222+dnl+nTh1atmzJwoULAUNgNm/eDMDu3bvp0aMH06ZNo2HDhuzbt489e/Zw0UUX8cADDzB8+HC2bNlSor6+ffvy/vvvU1RUxJEjR1i1ahXdu3cv17VpNJqqQbAL1EbAIiKdgNeAj10dKCJzRKSriHS94AKPebCCngsuuIB58+YxZswYOnbsSM+ePdmxYwf16tVj4sSJxMfHM2LECLp161au+u+8807atWtH586d6dChA3fddReFhYXccMMNNG/e3L6tR48edvNjadLT0/nvf/9Lp06daN++PZ988gkAkydPJj4+ng4dOtC3b186derE+++/T4cOHUhISGDHjh3cfvvtJeoaOXIkHTt2pFOnTlx11VU8//zzNG7cuFzXptFUBnQ0DM+oQHtE2Ux8nztzknBybCbQVUSOujuua9euUjph4S+//ELbtm3L39FqxMmTJ6lVqxbHjh2je/furF27VouFDf090niD0tEwwPBEnDNnTrVYW1NK/SQiXT0dF9QzKKVUY2WLL6OU6o7R32OB7VXVZ9iwYSQkJNCnTx+eeOIJLU4ajZfR0TDMEWg38/lAf6ChUmo/8BQQDiAis4EbgXuUUoXAaeAWCfSUrxrgat1Jo9F4Bx0NwxyB9uIb42H/TAw3dI1Go6kyxMbGkpWV5XS75hxBbeLTaDQas1QmpwMdDcMcWqA0Gk2lp9jpICsrCxGxp+AIVpFKTExkzpw5WCwWlFJYLJZq4yBRFgLuxecLtBefxlfo71FwEhcX59RkZrFYyMzM9H+HNG6pEl58VY3Q0FASEhLo0KEDo0ePPs+LpzTFgVT9zYYNG3jggQfcHvPtt98ybFjliUA1ZMgQe1xATdVDOx1UTbRA+ZGoqCgyMjLYunUrERERzJ49O9BdckrXrl159dVXK1yPN0ISeSus0dKlS6lXr55X6tIEHzoFR9VEC1SA6NOnjz2M0UsvvUSHDh3o0KEDL7/88nnHjh071h6lAQz79aeffuo2Vcf8+fPt0RweeeQR+/ZatWrxyCOP0KVLF6655hp+/PFH+vfvz0UXXcSnn34KlJwd/fjjj1xxxRVcdtllXHHFFfz6669ur2vevHmMHj2a6667jgEDBgDwwgsv2NN6PPXUU/Zjn376adq0acO1117LmDFjePHFF4Hz04YcOXKEG264gW7dutGtWzfWrl0LwMqVK0lISCAhIYHLLruM3NxcDh06RN++fe0z1dWrVwOGCejo0aMu73dmZiZt27Zl4sSJtG/fngEDBnD69GmPn6MmONBOB1UUEalypUuXLlKa7du3n3sDvikeqFmzpoiIFBQUyPDhw2XWrFmyYcMG6dChg5w8eVJyc3OlXbt2snHjxhLHf/vtt3L99deLiEhOTo7ExcVJQUGBpKamSsuWLSUnJ0dOnz4tsbGxsnfvXjlw4IC0aNFCsrOzpaCgQK688kr56KOPbJeOLF26VERERowYIddee63k5+dLRkaGdOrUSUREVqxYIUOHDhURkePHj0tBQYGIiHz99dcyatSo845xJDU1VZo1aybHjh0TEZFly5bJxIkTxWq1SlFRkQwdOlRWrlwp69evl06dOkleXp6cOHFCWrVqJS+88IKIiPTr10/uuecee51jxoyR1atXi4hIVlaWtGnTRkREhg0bJmvWrBERkdzcXCkoKJAXX3xRpk+fLiIihYWFcuLECRERsVgscuTIEZf3+/fff5fQ0FDZtGmTiIiMHj1a3n333fOur8T3SBNUpKWlicViEaWUWCwWSUtLC3SXNC4ANoiJsTzQ6TaqFadPnyYhIQEwZlB33HEHr7/+OiNHjrRHCR81ahSrV6/msssus5/Xr18/7r33XrKzs1m8eDE33HADYWHGR+csVcexY8fo378/xTEJExMTWbVqFSNGjCAiIoJBgwYBEB8fT40aNQgPDyc+Pt7pYvLx48cZN24cu3btQillDy7rjmuvvZYGDRoARlqPr776yn49J0+eZNeuXeTm5nL99dfb038UpwspxjFtyPLly9m+fbv9/YkTJ8jNzaVXr1489NBDJCYmMmrUKJo3b063bt2YMGECBQUFjBgxwn6/i1mzZo3T+z18+HBatmxpP75Lly56cb2SoVNwVD2qp0AFyHOxeA2qZFfM9WXs2LGkp6ezYMEC5s6da9/uKlWHK8LDw7FFjyIkJMR+fkhIiNP1nieeeIIrr7ySjz76iMzMTPr37++xr6XTejz22GPcddddJY6ZMWOG6TqsVivr1q2zi1kxjz76KEOHDmXp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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "d=5\n",
    "#和上面展示一致的建模流程\n",
    "LinearR = LinearRegression().fit(X, y)\n",
    "X_ = PF(degree=d).fit_transform(X)\n",
    "LinearR_ = LinearRegression().fit(X_, y)\n",
    "line = np.linspace(-3, 3, 1000, endpoint=False).reshape(-1, 1)\n",
    "line_ = PF(degree=d).fit_transform(line)\n",
    "\n",
    "#放置画布\n",
    "fig, ax1 = plt.subplots(1)\n",
    "\n",
    "#将测试数据带入predict接口，获得模型的拟合效果并进行绘制\n",
    "ax1.plot(line, LinearR.predict(line), linewidth=2, color='green'\n",
    "         ,label=\"linear regression\")\n",
    "ax1.plot(line, LinearR_.predict(line_), linewidth=2, color='red'\n",
    "         ,label=\"Polynomial regression\")\n",
    "\n",
    "#将原数据上的拟合绘制在图像上\n",
    "ax1.plot(X[:, 0], y, 'o', c='k')\n",
    "\n",
    "#其他图形选项\n",
    "ax1.legend(loc=\"best\")\n",
    "ax1.set_ylabel(\"Regression output\")\n",
    "ax1.set_xlabel(\"Input feature\")\n",
    "ax1.set_title(\"Linear Regression ordinary vs poly\")\n",
    "plt.tight_layout()\n",
    "plt.show()\n",
    "\n",
    "#来一起鼓掌，感叹多项式回归的神奇\n",
    "\n",
    "#随后可以试试看较低和较高的次方会发生什么变化\n",
    "#d=2\n",
    "#d=20"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 1, 2],\n",
       "       [3, 4, 5],\n",
       "       [6, 7, 8]])"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "from sklearn.linear_model import LinearRegression\n",
    "\n",
    "X = np.arange(9).reshape(3, 3)\n",
    "X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "poly = PolynomialFeatures(degree=5).fit(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['1',\n",
       " 'x0',\n",
       " 'x1',\n",
       " 'x2',\n",
       " 'x0^2',\n",
       " 'x0 x1',\n",
       " 'x0 x2',\n",
       " 'x1^2',\n",
       " 'x1 x2',\n",
       " 'x2^2',\n",
       " 'x0^3',\n",
       " 'x0^2 x1',\n",
       " 'x0^2 x2',\n",
       " 'x0 x1^2',\n",
       " 'x0 x1 x2',\n",
       " 'x0 x2^2',\n",
       " 'x1^3',\n",
       " 'x1^2 x2',\n",
       " 'x1 x2^2',\n",
       " 'x2^3',\n",
       " 'x0^4',\n",
       " 'x0^3 x1',\n",
       " 'x0^3 x2',\n",
       " 'x0^2 x1^2',\n",
       " 'x0^2 x1 x2',\n",
       " 'x0^2 x2^2',\n",
       " 'x0 x1^3',\n",
       " 'x0 x1^2 x2',\n",
       " 'x0 x1 x2^2',\n",
       " 'x0 x2^3',\n",
       " 'x1^4',\n",
       " 'x1^3 x2',\n",
       " 'x1^2 x2^2',\n",
       " 'x1 x2^3',\n",
       " 'x2^4',\n",
       " 'x0^5',\n",
       " 'x0^4 x1',\n",
       " 'x0^4 x2',\n",
       " 'x0^3 x1^2',\n",
       " 'x0^3 x1 x2',\n",
       " 'x0^3 x2^2',\n",
       " 'x0^2 x1^3',\n",
       " 'x0^2 x1^2 x2',\n",
       " 'x0^2 x1 x2^2',\n",
       " 'x0^2 x2^3',\n",
       " 'x0 x1^4',\n",
       " 'x0 x1^3 x2',\n",
       " 'x0 x1^2 x2^2',\n",
       " 'x0 x1 x2^3',\n",
       " 'x0 x2^4',\n",
       " 'x1^5',\n",
       " 'x1^4 x2',\n",
       " 'x1^3 x2^2',\n",
       " 'x1^2 x2^3',\n",
       " 'x1 x2^4',\n",
       " 'x2^5']"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#重要接口get_feature_names\n",
    "poly.get_feature_names()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['MedInc',\n",
       " 'HouseAge',\n",
       " 'AveRooms',\n",
       " 'AveBedrms',\n",
       " 'Population',\n",
       " 'AveOccup',\n",
       " 'Latitude',\n",
       " 'Longitude']"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.datasets import fetch_california_housing as fch\n",
    "import pandas as pd\n",
    "\n",
    "housevalue = fch()\n",
    "X = pd.DataFrame(housevalue.data)\n",
    "y = housevalue.target\n",
    "housevalue.feature_names"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [],
   "source": [
    "X.columns = [\"住户收入中位数\",\"房屋使用年代中位数\",\"平均房间数目\"\n",
    "            ,\"平均卧室数目\",\"街区人口\",\"平均入住率\",\"街区的纬度\",\"街区的经度\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>住户收入中位数</th>\n",
       "      <th>房屋使用年代中位数</th>\n",
       "      <th>平均房间数目</th>\n",
       "      <th>平均卧室数目</th>\n",
       "      <th>街区人口</th>\n",
       "      <th>平均入住率</th>\n",
       "      <th>街区的纬度</th>\n",
       "      <th>街区的经度</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>8.3252</td>\n",
       "      <td>41.0</td>\n",
       "      <td>6.984127</td>\n",
       "      <td>1.023810</td>\n",
       "      <td>322.0</td>\n",
       "      <td>2.555556</td>\n",
       "      <td>37.88</td>\n",
       "      <td>-122.23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8.3014</td>\n",
       "      <td>21.0</td>\n",
       "      <td>6.238137</td>\n",
       "      <td>0.971880</td>\n",
       "      <td>2401.0</td>\n",
       "      <td>2.109842</td>\n",
       "      <td>37.86</td>\n",
       "      <td>-122.22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>7.2574</td>\n",
       "      <td>52.0</td>\n",
       "      <td>8.288136</td>\n",
       "      <td>1.073446</td>\n",
       "      <td>496.0</td>\n",
       "      <td>2.802260</td>\n",
       "      <td>37.85</td>\n",
       "      <td>-122.24</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>5.6431</td>\n",
       "      <td>52.0</td>\n",
       "      <td>5.817352</td>\n",
       "      <td>1.073059</td>\n",
       "      <td>558.0</td>\n",
       "      <td>2.547945</td>\n",
       "      <td>37.85</td>\n",
       "      <td>-122.25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3.8462</td>\n",
       "      <td>52.0</td>\n",
       "      <td>6.281853</td>\n",
       "      <td>1.081081</td>\n",
       "      <td>565.0</td>\n",
       "      <td>2.181467</td>\n",
       "      <td>37.85</td>\n",
       "      <td>-122.25</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   住户收入中位数  房屋使用年代中位数    平均房间数目    平均卧室数目    街区人口     平均入住率  街区的纬度   街区的经度\n",
       "0   8.3252       41.0  6.984127  1.023810   322.0  2.555556  37.88 -122.23\n",
       "1   8.3014       21.0  6.238137  0.971880  2401.0  2.109842  37.86 -122.22\n",
       "2   7.2574       52.0  8.288136  1.073446   496.0  2.802260  37.85 -122.24\n",
       "3   5.6431       52.0  5.817352  1.073059   558.0  2.547945  37.85 -122.25\n",
       "4   3.8462       52.0  6.281853  1.081081   565.0  2.181467  37.85 -122.25"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [],
   "source": [
    "poly = PolynomialFeatures(degree=4).fit(X,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['1',\n",
       " '住户收入中位数',\n",
       " '房屋使用年代中位数',\n",
       " '平均房间数目',\n",
       " '平均卧室数目',\n",
       " '街区人口',\n",
       " '平均入住率',\n",
       " '街区的纬度',\n",
       " '街区的经度',\n",
       " '住户收入中位数^2',\n",
       " '住户收入中位数 房屋使用年代中位数',\n",
       " '住户收入中位数 平均房间数目',\n",
       " '住户收入中位数 平均卧室数目',\n",
       " '住户收入中位数 街区人口',\n",
       " '住户收入中位数 平均入住率',\n",
       " '住户收入中位数 街区的纬度',\n",
       " '住户收入中位数 街区的经度',\n",
       " '房屋使用年代中位数^2',\n",
       " '房屋使用年代中位数 平均房间数目',\n",
       " '房屋使用年代中位数 平均卧室数目',\n",
       " '房屋使用年代中位数 街区人口',\n",
       " '房屋使用年代中位数 平均入住率',\n",
       " '房屋使用年代中位数 街区的纬度',\n",
       " '房屋使用年代中位数 街区的经度',\n",
       " '平均房间数目^2',\n",
       " '平均房间数目 平均卧室数目',\n",
       " '平均房间数目 街区人口',\n",
       " '平均房间数目 平均入住率',\n",
       " '平均房间数目 街区的纬度',\n",
       " '平均房间数目 街区的经度',\n",
       " '平均卧室数目^2',\n",
       " '平均卧室数目 街区人口',\n",
       " '平均卧室数目 平均入住率',\n",
       " '平均卧室数目 街区的纬度',\n",
       " '平均卧室数目 街区的经度',\n",
       " '街区人口^2',\n",
       " '街区人口 平均入住率',\n",
       " '街区人口 街区的纬度',\n",
       " '街区人口 街区的经度',\n",
       " '平均入住率^2',\n",
       " '平均入住率 街区的纬度',\n",
       " '平均入住率 街区的经度',\n",
       " '街区的纬度^2',\n",
       " '街区的纬度 街区的经度',\n",
       " '街区的经度^2',\n",
       " '住户收入中位数^3',\n",
       " '住户收入中位数^2 房屋使用年代中位数',\n",
       " '住户收入中位数^2 平均房间数目',\n",
       " '住户收入中位数^2 平均卧室数目',\n",
       " '住户收入中位数^2 街区人口',\n",
       " '住户收入中位数^2 平均入住率',\n",
       " '住户收入中位数^2 街区的纬度',\n",
       " '住户收入中位数^2 街区的经度',\n",
       " '住户收入中位数 房屋使用年代中位数^2',\n",
       " '住户收入中位数 房屋使用年代中位数 平均房间数目',\n",
       " '住户收入中位数 房屋使用年代中位数 平均卧室数目',\n",
       " '住户收入中位数 房屋使用年代中位数 街区人口',\n",
       " '住户收入中位数 房屋使用年代中位数 平均入住率',\n",
       " '住户收入中位数 房屋使用年代中位数 街区的纬度',\n",
       " '住户收入中位数 房屋使用年代中位数 街区的经度',\n",
       " '住户收入中位数 平均房间数目^2',\n",
       " '住户收入中位数 平均房间数目 平均卧室数目',\n",
       " '住户收入中位数 平均房间数目 街区人口',\n",
       " '住户收入中位数 平均房间数目 平均入住率',\n",
       " '住户收入中位数 平均房间数目 街区的纬度',\n",
       " '住户收入中位数 平均房间数目 街区的经度',\n",
       " '住户收入中位数 平均卧室数目^2',\n",
       " '住户收入中位数 平均卧室数目 街区人口',\n",
       " '住户收入中位数 平均卧室数目 平均入住率',\n",
       " '住户收入中位数 平均卧室数目 街区的纬度',\n",
       " '住户收入中位数 平均卧室数目 街区的经度',\n",
       " '住户收入中位数 街区人口^2',\n",
       " '住户收入中位数 街区人口 平均入住率',\n",
       " '住户收入中位数 街区人口 街区的纬度',\n",
       " '住户收入中位数 街区人口 街区的经度',\n",
       " '住户收入中位数 平均入住率^2',\n",
       " '住户收入中位数 平均入住率 街区的纬度',\n",
       " '住户收入中位数 平均入住率 街区的经度',\n",
       " '住户收入中位数 街区的纬度^2',\n",
       " '住户收入中位数 街区的纬度 街区的经度',\n",
       " '住户收入中位数 街区的经度^2',\n",
       " '房屋使用年代中位数^3',\n",
       " '房屋使用年代中位数^2 平均房间数目',\n",
       " '房屋使用年代中位数^2 平均卧室数目',\n",
       " '房屋使用年代中位数^2 街区人口',\n",
       " '房屋使用年代中位数^2 平均入住率',\n",
       " '房屋使用年代中位数^2 街区的纬度',\n",
       " '房屋使用年代中位数^2 街区的经度',\n",
       " '房屋使用年代中位数 平均房间数目^2',\n",
       " '房屋使用年代中位数 平均房间数目 平均卧室数目',\n",
       " '房屋使用年代中位数 平均房间数目 街区人口',\n",
       " '房屋使用年代中位数 平均房间数目 平均入住率',\n",
       " '房屋使用年代中位数 平均房间数目 街区的纬度',\n",
       " '房屋使用年代中位数 平均房间数目 街区的经度',\n",
       " '房屋使用年代中位数 平均卧室数目^2',\n",
       " '房屋使用年代中位数 平均卧室数目 街区人口',\n",
       " '房屋使用年代中位数 平均卧室数目 平均入住率',\n",
       " '房屋使用年代中位数 平均卧室数目 街区的纬度',\n",
       " '房屋使用年代中位数 平均卧室数目 街区的经度',\n",
       " '房屋使用年代中位数 街区人口^2',\n",
       " '房屋使用年代中位数 街区人口 平均入住率',\n",
       " '房屋使用年代中位数 街区人口 街区的纬度',\n",
       " '房屋使用年代中位数 街区人口 街区的经度',\n",
       " '房屋使用年代中位数 平均入住率^2',\n",
       " '房屋使用年代中位数 平均入住率 街区的纬度',\n",
       " '房屋使用年代中位数 平均入住率 街区的经度',\n",
       " '房屋使用年代中位数 街区的纬度^2',\n",
       " '房屋使用年代中位数 街区的纬度 街区的经度',\n",
       " '房屋使用年代中位数 街区的经度^2',\n",
       " '平均房间数目^3',\n",
       " '平均房间数目^2 平均卧室数目',\n",
       " '平均房间数目^2 街区人口',\n",
       " '平均房间数目^2 平均入住率',\n",
       " '平均房间数目^2 街区的纬度',\n",
       " '平均房间数目^2 街区的经度',\n",
       " '平均房间数目 平均卧室数目^2',\n",
       " '平均房间数目 平均卧室数目 街区人口',\n",
       " '平均房间数目 平均卧室数目 平均入住率',\n",
       " '平均房间数目 平均卧室数目 街区的纬度',\n",
       " '平均房间数目 平均卧室数目 街区的经度',\n",
       " '平均房间数目 街区人口^2',\n",
       " '平均房间数目 街区人口 平均入住率',\n",
       " '平均房间数目 街区人口 街区的纬度',\n",
       " '平均房间数目 街区人口 街区的经度',\n",
       " '平均房间数目 平均入住率^2',\n",
       " '平均房间数目 平均入住率 街区的纬度',\n",
       " '平均房间数目 平均入住率 街区的经度',\n",
       " '平均房间数目 街区的纬度^2',\n",
       " '平均房间数目 街区的纬度 街区的经度',\n",
       " '平均房间数目 街区的经度^2',\n",
       " '平均卧室数目^3',\n",
       " '平均卧室数目^2 街区人口',\n",
       " '平均卧室数目^2 平均入住率',\n",
       " '平均卧室数目^2 街区的纬度',\n",
       " '平均卧室数目^2 街区的经度',\n",
       " '平均卧室数目 街区人口^2',\n",
       " '平均卧室数目 街区人口 平均入住率',\n",
       " '平均卧室数目 街区人口 街区的纬度',\n",
       " '平均卧室数目 街区人口 街区的经度',\n",
       " '平均卧室数目 平均入住率^2',\n",
       " '平均卧室数目 平均入住率 街区的纬度',\n",
       " '平均卧室数目 平均入住率 街区的经度',\n",
       " '平均卧室数目 街区的纬度^2',\n",
       " '平均卧室数目 街区的纬度 街区的经度',\n",
       " '平均卧室数目 街区的经度^2',\n",
       " '街区人口^3',\n",
       " '街区人口^2 平均入住率',\n",
       " '街区人口^2 街区的纬度',\n",
       " '街区人口^2 街区的经度',\n",
       " '街区人口 平均入住率^2',\n",
       " '街区人口 平均入住率 街区的纬度',\n",
       " '街区人口 平均入住率 街区的经度',\n",
       " '街区人口 街区的纬度^2',\n",
       " '街区人口 街区的纬度 街区的经度',\n",
       " '街区人口 街区的经度^2',\n",
       " '平均入住率^3',\n",
       " '平均入住率^2 街区的纬度',\n",
       " '平均入住率^2 街区的经度',\n",
       " '平均入住率 街区的纬度^2',\n",
       " '平均入住率 街区的纬度 街区的经度',\n",
       " '平均入住率 街区的经度^2',\n",
       " '街区的纬度^3',\n",
       " '街区的纬度^2 街区的经度',\n",
       " '街区的纬度 街区的经度^2',\n",
       " '街区的经度^3',\n",
       " '住户收入中位数^4',\n",
       " '住户收入中位数^3 房屋使用年代中位数',\n",
       " '住户收入中位数^3 平均房间数目',\n",
       " '住户收入中位数^3 平均卧室数目',\n",
       " '住户收入中位数^3 街区人口',\n",
       " '住户收入中位数^3 平均入住率',\n",
       " '住户收入中位数^3 街区的纬度',\n",
       " '住户收入中位数^3 街区的经度',\n",
       " '住户收入中位数^2 房屋使用年代中位数^2',\n",
       " '住户收入中位数^2 房屋使用年代中位数 平均房间数目',\n",
       " '住户收入中位数^2 房屋使用年代中位数 平均卧室数目',\n",
       " '住户收入中位数^2 房屋使用年代中位数 街区人口',\n",
       " '住户收入中位数^2 房屋使用年代中位数 平均入住率',\n",
       " '住户收入中位数^2 房屋使用年代中位数 街区的纬度',\n",
       " '住户收入中位数^2 房屋使用年代中位数 街区的经度',\n",
       " '住户收入中位数^2 平均房间数目^2',\n",
       " '住户收入中位数^2 平均房间数目 平均卧室数目',\n",
       " '住户收入中位数^2 平均房间数目 街区人口',\n",
       " '住户收入中位数^2 平均房间数目 平均入住率',\n",
       " '住户收入中位数^2 平均房间数目 街区的纬度',\n",
       " '住户收入中位数^2 平均房间数目 街区的经度',\n",
       " '住户收入中位数^2 平均卧室数目^2',\n",
       " '住户收入中位数^2 平均卧室数目 街区人口',\n",
       " '住户收入中位数^2 平均卧室数目 平均入住率',\n",
       " '住户收入中位数^2 平均卧室数目 街区的纬度',\n",
       " '住户收入中位数^2 平均卧室数目 街区的经度',\n",
       " '住户收入中位数^2 街区人口^2',\n",
       " '住户收入中位数^2 街区人口 平均入住率',\n",
       " '住户收入中位数^2 街区人口 街区的纬度',\n",
       " '住户收入中位数^2 街区人口 街区的经度',\n",
       " '住户收入中位数^2 平均入住率^2',\n",
       " '住户收入中位数^2 平均入住率 街区的纬度',\n",
       " '住户收入中位数^2 平均入住率 街区的经度',\n",
       " '住户收入中位数^2 街区的纬度^2',\n",
       " '住户收入中位数^2 街区的纬度 街区的经度',\n",
       " '住户收入中位数^2 街区的经度^2',\n",
       " '住户收入中位数 房屋使用年代中位数^3',\n",
       " '住户收入中位数 房屋使用年代中位数^2 平均房间数目',\n",
       " '住户收入中位数 房屋使用年代中位数^2 平均卧室数目',\n",
       " '住户收入中位数 房屋使用年代中位数^2 街区人口',\n",
       " '住户收入中位数 房屋使用年代中位数^2 平均入住率',\n",
       " '住户收入中位数 房屋使用年代中位数^2 街区的纬度',\n",
       " '住户收入中位数 房屋使用年代中位数^2 街区的经度',\n",
       " '住户收入中位数 房屋使用年代中位数 平均房间数目^2',\n",
       " '住户收入中位数 房屋使用年代中位数 平均房间数目 平均卧室数目',\n",
       " '住户收入中位数 房屋使用年代中位数 平均房间数目 街区人口',\n",
       " '住户收入中位数 房屋使用年代中位数 平均房间数目 平均入住率',\n",
       " '住户收入中位数 房屋使用年代中位数 平均房间数目 街区的纬度',\n",
       " '住户收入中位数 房屋使用年代中位数 平均房间数目 街区的经度',\n",
       " '住户收入中位数 房屋使用年代中位数 平均卧室数目^2',\n",
       " '住户收入中位数 房屋使用年代中位数 平均卧室数目 街区人口',\n",
       " '住户收入中位数 房屋使用年代中位数 平均卧室数目 平均入住率',\n",
       " '住户收入中位数 房屋使用年代中位数 平均卧室数目 街区的纬度',\n",
       " '住户收入中位数 房屋使用年代中位数 平均卧室数目 街区的经度',\n",
       " '住户收入中位数 房屋使用年代中位数 街区人口^2',\n",
       " '住户收入中位数 房屋使用年代中位数 街区人口 平均入住率',\n",
       " '住户收入中位数 房屋使用年代中位数 街区人口 街区的纬度',\n",
       " '住户收入中位数 房屋使用年代中位数 街区人口 街区的经度',\n",
       " '住户收入中位数 房屋使用年代中位数 平均入住率^2',\n",
       " '住户收入中位数 房屋使用年代中位数 平均入住率 街区的纬度',\n",
       " '住户收入中位数 房屋使用年代中位数 平均入住率 街区的经度',\n",
       " '住户收入中位数 房屋使用年代中位数 街区的纬度^2',\n",
       " '住户收入中位数 房屋使用年代中位数 街区的纬度 街区的经度',\n",
       " '住户收入中位数 房屋使用年代中位数 街区的经度^2',\n",
       " '住户收入中位数 平均房间数目^3',\n",
       " '住户收入中位数 平均房间数目^2 平均卧室数目',\n",
       " '住户收入中位数 平均房间数目^2 街区人口',\n",
       " '住户收入中位数 平均房间数目^2 平均入住率',\n",
       " '住户收入中位数 平均房间数目^2 街区的纬度',\n",
       " '住户收入中位数 平均房间数目^2 街区的经度',\n",
       " '住户收入中位数 平均房间数目 平均卧室数目^2',\n",
       " '住户收入中位数 平均房间数目 平均卧室数目 街区人口',\n",
       " '住户收入中位数 平均房间数目 平均卧室数目 平均入住率',\n",
       " '住户收入中位数 平均房间数目 平均卧室数目 街区的纬度',\n",
       " '住户收入中位数 平均房间数目 平均卧室数目 街区的经度',\n",
       " '住户收入中位数 平均房间数目 街区人口^2',\n",
       " '住户收入中位数 平均房间数目 街区人口 平均入住率',\n",
       " '住户收入中位数 平均房间数目 街区人口 街区的纬度',\n",
       " '住户收入中位数 平均房间数目 街区人口 街区的经度',\n",
       " '住户收入中位数 平均房间数目 平均入住率^2',\n",
       " '住户收入中位数 平均房间数目 平均入住率 街区的纬度',\n",
       " '住户收入中位数 平均房间数目 平均入住率 街区的经度',\n",
       " '住户收入中位数 平均房间数目 街区的纬度^2',\n",
       " '住户收入中位数 平均房间数目 街区的纬度 街区的经度',\n",
       " '住户收入中位数 平均房间数目 街区的经度^2',\n",
       " '住户收入中位数 平均卧室数目^3',\n",
       " '住户收入中位数 平均卧室数目^2 街区人口',\n",
       " '住户收入中位数 平均卧室数目^2 平均入住率',\n",
       " '住户收入中位数 平均卧室数目^2 街区的纬度',\n",
       " '住户收入中位数 平均卧室数目^2 街区的经度',\n",
       " '住户收入中位数 平均卧室数目 街区人口^2',\n",
       " '住户收入中位数 平均卧室数目 街区人口 平均入住率',\n",
       " '住户收入中位数 平均卧室数目 街区人口 街区的纬度',\n",
       " '住户收入中位数 平均卧室数目 街区人口 街区的经度',\n",
       " '住户收入中位数 平均卧室数目 平均入住率^2',\n",
       " '住户收入中位数 平均卧室数目 平均入住率 街区的纬度',\n",
       " '住户收入中位数 平均卧室数目 平均入住率 街区的经度',\n",
       " '住户收入中位数 平均卧室数目 街区的纬度^2',\n",
       " '住户收入中位数 平均卧室数目 街区的纬度 街区的经度',\n",
       " '住户收入中位数 平均卧室数目 街区的经度^2',\n",
       " '住户收入中位数 街区人口^3',\n",
       " '住户收入中位数 街区人口^2 平均入住率',\n",
       " '住户收入中位数 街区人口^2 街区的纬度',\n",
       " '住户收入中位数 街区人口^2 街区的经度',\n",
       " '住户收入中位数 街区人口 平均入住率^2',\n",
       " '住户收入中位数 街区人口 平均入住率 街区的纬度',\n",
       " '住户收入中位数 街区人口 平均入住率 街区的经度',\n",
       " '住户收入中位数 街区人口 街区的纬度^2',\n",
       " '住户收入中位数 街区人口 街区的纬度 街区的经度',\n",
       " '住户收入中位数 街区人口 街区的经度^2',\n",
       " '住户收入中位数 平均入住率^3',\n",
       " '住户收入中位数 平均入住率^2 街区的纬度',\n",
       " '住户收入中位数 平均入住率^2 街区的经度',\n",
       " '住户收入中位数 平均入住率 街区的纬度^2',\n",
       " '住户收入中位数 平均入住率 街区的纬度 街区的经度',\n",
       " '住户收入中位数 平均入住率 街区的经度^2',\n",
       " '住户收入中位数 街区的纬度^3',\n",
       " '住户收入中位数 街区的纬度^2 街区的经度',\n",
       " '住户收入中位数 街区的纬度 街区的经度^2',\n",
       " '住户收入中位数 街区的经度^3',\n",
       " '房屋使用年代中位数^4',\n",
       " '房屋使用年代中位数^3 平均房间数目',\n",
       " '房屋使用年代中位数^3 平均卧室数目',\n",
       " '房屋使用年代中位数^3 街区人口',\n",
       " '房屋使用年代中位数^3 平均入住率',\n",
       " '房屋使用年代中位数^3 街区的纬度',\n",
       " '房屋使用年代中位数^3 街区的经度',\n",
       " '房屋使用年代中位数^2 平均房间数目^2',\n",
       " '房屋使用年代中位数^2 平均房间数目 平均卧室数目',\n",
       " '房屋使用年代中位数^2 平均房间数目 街区人口',\n",
       " '房屋使用年代中位数^2 平均房间数目 平均入住率',\n",
       " '房屋使用年代中位数^2 平均房间数目 街区的纬度',\n",
       " '房屋使用年代中位数^2 平均房间数目 街区的经度',\n",
       " '房屋使用年代中位数^2 平均卧室数目^2',\n",
       " '房屋使用年代中位数^2 平均卧室数目 街区人口',\n",
       " '房屋使用年代中位数^2 平均卧室数目 平均入住率',\n",
       " '房屋使用年代中位数^2 平均卧室数目 街区的纬度',\n",
       " '房屋使用年代中位数^2 平均卧室数目 街区的经度',\n",
       " '房屋使用年代中位数^2 街区人口^2',\n",
       " '房屋使用年代中位数^2 街区人口 平均入住率',\n",
       " '房屋使用年代中位数^2 街区人口 街区的纬度',\n",
       " '房屋使用年代中位数^2 街区人口 街区的经度',\n",
       " '房屋使用年代中位数^2 平均入住率^2',\n",
       " '房屋使用年代中位数^2 平均入住率 街区的纬度',\n",
       " '房屋使用年代中位数^2 平均入住率 街区的经度',\n",
       " '房屋使用年代中位数^2 街区的纬度^2',\n",
       " '房屋使用年代中位数^2 街区的纬度 街区的经度',\n",
       " '房屋使用年代中位数^2 街区的经度^2',\n",
       " '房屋使用年代中位数 平均房间数目^3',\n",
       " '房屋使用年代中位数 平均房间数目^2 平均卧室数目',\n",
       " '房屋使用年代中位数 平均房间数目^2 街区人口',\n",
       " '房屋使用年代中位数 平均房间数目^2 平均入住率',\n",
       " '房屋使用年代中位数 平均房间数目^2 街区的纬度',\n",
       " '房屋使用年代中位数 平均房间数目^2 街区的经度',\n",
       " '房屋使用年代中位数 平均房间数目 平均卧室数目^2',\n",
       " '房屋使用年代中位数 平均房间数目 平均卧室数目 街区人口',\n",
       " '房屋使用年代中位数 平均房间数目 平均卧室数目 平均入住率',\n",
       " '房屋使用年代中位数 平均房间数目 平均卧室数目 街区的纬度',\n",
       " '房屋使用年代中位数 平均房间数目 平均卧室数目 街区的经度',\n",
       " '房屋使用年代中位数 平均房间数目 街区人口^2',\n",
       " '房屋使用年代中位数 平均房间数目 街区人口 平均入住率',\n",
       " '房屋使用年代中位数 平均房间数目 街区人口 街区的纬度',\n",
       " '房屋使用年代中位数 平均房间数目 街区人口 街区的经度',\n",
       " '房屋使用年代中位数 平均房间数目 平均入住率^2',\n",
       " '房屋使用年代中位数 平均房间数目 平均入住率 街区的纬度',\n",
       " '房屋使用年代中位数 平均房间数目 平均入住率 街区的经度',\n",
       " '房屋使用年代中位数 平均房间数目 街区的纬度^2',\n",
       " '房屋使用年代中位数 平均房间数目 街区的纬度 街区的经度',\n",
       " '房屋使用年代中位数 平均房间数目 街区的经度^2',\n",
       " '房屋使用年代中位数 平均卧室数目^3',\n",
       " '房屋使用年代中位数 平均卧室数目^2 街区人口',\n",
       " '房屋使用年代中位数 平均卧室数目^2 平均入住率',\n",
       " '房屋使用年代中位数 平均卧室数目^2 街区的纬度',\n",
       " '房屋使用年代中位数 平均卧室数目^2 街区的经度',\n",
       " '房屋使用年代中位数 平均卧室数目 街区人口^2',\n",
       " '房屋使用年代中位数 平均卧室数目 街区人口 平均入住率',\n",
       " '房屋使用年代中位数 平均卧室数目 街区人口 街区的纬度',\n",
       " '房屋使用年代中位数 平均卧室数目 街区人口 街区的经度',\n",
       " '房屋使用年代中位数 平均卧室数目 平均入住率^2',\n",
       " '房屋使用年代中位数 平均卧室数目 平均入住率 街区的纬度',\n",
       " '房屋使用年代中位数 平均卧室数目 平均入住率 街区的经度',\n",
       " '房屋使用年代中位数 平均卧室数目 街区的纬度^2',\n",
       " '房屋使用年代中位数 平均卧室数目 街区的纬度 街区的经度',\n",
       " '房屋使用年代中位数 平均卧室数目 街区的经度^2',\n",
       " '房屋使用年代中位数 街区人口^3',\n",
       " '房屋使用年代中位数 街区人口^2 平均入住率',\n",
       " '房屋使用年代中位数 街区人口^2 街区的纬度',\n",
       " '房屋使用年代中位数 街区人口^2 街区的经度',\n",
       " '房屋使用年代中位数 街区人口 平均入住率^2',\n",
       " '房屋使用年代中位数 街区人口 平均入住率 街区的纬度',\n",
       " '房屋使用年代中位数 街区人口 平均入住率 街区的经度',\n",
       " '房屋使用年代中位数 街区人口 街区的纬度^2',\n",
       " '房屋使用年代中位数 街区人口 街区的纬度 街区的经度',\n",
       " '房屋使用年代中位数 街区人口 街区的经度^2',\n",
       " '房屋使用年代中位数 平均入住率^3',\n",
       " '房屋使用年代中位数 平均入住率^2 街区的纬度',\n",
       " '房屋使用年代中位数 平均入住率^2 街区的经度',\n",
       " '房屋使用年代中位数 平均入住率 街区的纬度^2',\n",
       " '房屋使用年代中位数 平均入住率 街区的纬度 街区的经度',\n",
       " '房屋使用年代中位数 平均入住率 街区的经度^2',\n",
       " '房屋使用年代中位数 街区的纬度^3',\n",
       " '房屋使用年代中位数 街区的纬度^2 街区的经度',\n",
       " '房屋使用年代中位数 街区的纬度 街区的经度^2',\n",
       " '房屋使用年代中位数 街区的经度^3',\n",
       " '平均房间数目^4',\n",
       " '平均房间数目^3 平均卧室数目',\n",
       " '平均房间数目^3 街区人口',\n",
       " '平均房间数目^3 平均入住率',\n",
       " '平均房间数目^3 街区的纬度',\n",
       " '平均房间数目^3 街区的经度',\n",
       " '平均房间数目^2 平均卧室数目^2',\n",
       " '平均房间数目^2 平均卧室数目 街区人口',\n",
       " '平均房间数目^2 平均卧室数目 平均入住率',\n",
       " '平均房间数目^2 平均卧室数目 街区的纬度',\n",
       " '平均房间数目^2 平均卧室数目 街区的经度',\n",
       " '平均房间数目^2 街区人口^2',\n",
       " '平均房间数目^2 街区人口 平均入住率',\n",
       " '平均房间数目^2 街区人口 街区的纬度',\n",
       " '平均房间数目^2 街区人口 街区的经度',\n",
       " '平均房间数目^2 平均入住率^2',\n",
       " '平均房间数目^2 平均入住率 街区的纬度',\n",
       " '平均房间数目^2 平均入住率 街区的经度',\n",
       " '平均房间数目^2 街区的纬度^2',\n",
       " '平均房间数目^2 街区的纬度 街区的经度',\n",
       " '平均房间数目^2 街区的经度^2',\n",
       " '平均房间数目 平均卧室数目^3',\n",
       " '平均房间数目 平均卧室数目^2 街区人口',\n",
       " '平均房间数目 平均卧室数目^2 平均入住率',\n",
       " '平均房间数目 平均卧室数目^2 街区的纬度',\n",
       " '平均房间数目 平均卧室数目^2 街区的经度',\n",
       " '平均房间数目 平均卧室数目 街区人口^2',\n",
       " '平均房间数目 平均卧室数目 街区人口 平均入住率',\n",
       " '平均房间数目 平均卧室数目 街区人口 街区的纬度',\n",
       " '平均房间数目 平均卧室数目 街区人口 街区的经度',\n",
       " '平均房间数目 平均卧室数目 平均入住率^2',\n",
       " '平均房间数目 平均卧室数目 平均入住率 街区的纬度',\n",
       " '平均房间数目 平均卧室数目 平均入住率 街区的经度',\n",
       " '平均房间数目 平均卧室数目 街区的纬度^2',\n",
       " '平均房间数目 平均卧室数目 街区的纬度 街区的经度',\n",
       " '平均房间数目 平均卧室数目 街区的经度^2',\n",
       " '平均房间数目 街区人口^3',\n",
       " '平均房间数目 街区人口^2 平均入住率',\n",
       " '平均房间数目 街区人口^2 街区的纬度',\n",
       " '平均房间数目 街区人口^2 街区的经度',\n",
       " '平均房间数目 街区人口 平均入住率^2',\n",
       " '平均房间数目 街区人口 平均入住率 街区的纬度',\n",
       " '平均房间数目 街区人口 平均入住率 街区的经度',\n",
       " '平均房间数目 街区人口 街区的纬度^2',\n",
       " '平均房间数目 街区人口 街区的纬度 街区的经度',\n",
       " '平均房间数目 街区人口 街区的经度^2',\n",
       " '平均房间数目 平均入住率^3',\n",
       " '平均房间数目 平均入住率^2 街区的纬度',\n",
       " '平均房间数目 平均入住率^2 街区的经度',\n",
       " '平均房间数目 平均入住率 街区的纬度^2',\n",
       " '平均房间数目 平均入住率 街区的纬度 街区的经度',\n",
       " '平均房间数目 平均入住率 街区的经度^2',\n",
       " '平均房间数目 街区的纬度^3',\n",
       " '平均房间数目 街区的纬度^2 街区的经度',\n",
       " '平均房间数目 街区的纬度 街区的经度^2',\n",
       " '平均房间数目 街区的经度^3',\n",
       " '平均卧室数目^4',\n",
       " '平均卧室数目^3 街区人口',\n",
       " '平均卧室数目^3 平均入住率',\n",
       " '平均卧室数目^3 街区的纬度',\n",
       " '平均卧室数目^3 街区的经度',\n",
       " '平均卧室数目^2 街区人口^2',\n",
       " '平均卧室数目^2 街区人口 平均入住率',\n",
       " '平均卧室数目^2 街区人口 街区的纬度',\n",
       " '平均卧室数目^2 街区人口 街区的经度',\n",
       " '平均卧室数目^2 平均入住率^2',\n",
       " '平均卧室数目^2 平均入住率 街区的纬度',\n",
       " '平均卧室数目^2 平均入住率 街区的经度',\n",
       " '平均卧室数目^2 街区的纬度^2',\n",
       " '平均卧室数目^2 街区的纬度 街区的经度',\n",
       " '平均卧室数目^2 街区的经度^2',\n",
       " '平均卧室数目 街区人口^3',\n",
       " '平均卧室数目 街区人口^2 平均入住率',\n",
       " '平均卧室数目 街区人口^2 街区的纬度',\n",
       " '平均卧室数目 街区人口^2 街区的经度',\n",
       " '平均卧室数目 街区人口 平均入住率^2',\n",
       " '平均卧室数目 街区人口 平均入住率 街区的纬度',\n",
       " '平均卧室数目 街区人口 平均入住率 街区的经度',\n",
       " '平均卧室数目 街区人口 街区的纬度^2',\n",
       " '平均卧室数目 街区人口 街区的纬度 街区的经度',\n",
       " '平均卧室数目 街区人口 街区的经度^2',\n",
       " '平均卧室数目 平均入住率^3',\n",
       " '平均卧室数目 平均入住率^2 街区的纬度',\n",
       " '平均卧室数目 平均入住率^2 街区的经度',\n",
       " '平均卧室数目 平均入住率 街区的纬度^2',\n",
       " '平均卧室数目 平均入住率 街区的纬度 街区的经度',\n",
       " '平均卧室数目 平均入住率 街区的经度^2',\n",
       " '平均卧室数目 街区的纬度^3',\n",
       " '平均卧室数目 街区的纬度^2 街区的经度',\n",
       " '平均卧室数目 街区的纬度 街区的经度^2',\n",
       " '平均卧室数目 街区的经度^3',\n",
       " '街区人口^4',\n",
       " '街区人口^3 平均入住率',\n",
       " '街区人口^3 街区的纬度',\n",
       " '街区人口^3 街区的经度',\n",
       " '街区人口^2 平均入住率^2',\n",
       " '街区人口^2 平均入住率 街区的纬度',\n",
       " '街区人口^2 平均入住率 街区的经度',\n",
       " '街区人口^2 街区的纬度^2',\n",
       " '街区人口^2 街区的纬度 街区的经度',\n",
       " '街区人口^2 街区的经度^2',\n",
       " '街区人口 平均入住率^3',\n",
       " '街区人口 平均入住率^2 街区的纬度',\n",
       " '街区人口 平均入住率^2 街区的经度',\n",
       " '街区人口 平均入住率 街区的纬度^2',\n",
       " '街区人口 平均入住率 街区的纬度 街区的经度',\n",
       " '街区人口 平均入住率 街区的经度^2',\n",
       " '街区人口 街区的纬度^3',\n",
       " '街区人口 街区的纬度^2 街区的经度',\n",
       " '街区人口 街区的纬度 街区的经度^2',\n",
       " '街区人口 街区的经度^3',\n",
       " '平均入住率^4',\n",
       " '平均入住率^3 街区的纬度',\n",
       " '平均入住率^3 街区的经度',\n",
       " '平均入住率^2 街区的纬度^2',\n",
       " '平均入住率^2 街区的纬度 街区的经度',\n",
       " '平均入住率^2 街区的经度^2',\n",
       " '平均入住率 街区的纬度^3',\n",
       " '平均入住率 街区的纬度^2 街区的经度',\n",
       " '平均入住率 街区的纬度 街区的经度^2',\n",
       " '平均入住率 街区的经度^3',\n",
       " '街区的纬度^4',\n",
       " '街区的纬度^3 街区的经度',\n",
       " '街区的纬度^2 街区的经度^2',\n",
       " '街区的纬度 街区的经度^3',\n",
       " '街区的经度^4']"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "poly.get_feature_names(X.columns)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_ = poly.transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [],
   "source": [
    "#在这之后，我们依然可以直接建立模型，然后使用线性回归的coef_属性来查看什么特征对标签的影响最大\n",
    "reg = LinearRegression().fit(X_,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [],
   "source": [
    "coef = reg.coef_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 3.10808260e-04, -2.29593275e-05, -1.86555823e-07,  3.14540980e-09,\n",
       "       -1.00201271e-07, -5.19948347e-05,  7.14311031e-08,  4.16703056e-07,\n",
       "        5.43864807e-08, -9.52364163e-06, -1.16565513e-05, -1.93026352e-05,\n",
       "       -2.36028415e-06, -5.93269415e-05,  2.41120302e-06, -1.05762608e-06,\n",
       "        1.14243699e-05, -8.09650966e-06,  1.03024176e-05, -6.82691390e-06,\n",
       "       -7.58175217e-04,  3.55009488e-05,  1.25185532e-05,  2.81618206e-05,\n",
       "       -1.11578705e-05,  3.64080725e-06, -1.12579472e-04, -4.95652189e-06,\n",
       "        1.69265053e-06, -5.08685341e-06,  1.65736112e-06, -2.78832974e-05,\n",
       "       -9.44920031e-07, -1.31392851e-06,  8.27152876e-06,  2.43950726e-05,\n",
       "       -4.46846779e-05, -7.03350953e-04,  2.08525543e-03, -7.72843579e-06,\n",
       "       -9.85983811e-07, -5.59809918e-06, -3.99871884e-06, -2.50108280e-05,\n",
       "       -6.11054901e-06, -8.42321654e-05, -1.51762683e-04, -9.64464932e-05,\n",
       "       -1.19005828e-05,  6.28965193e-04,  3.59736646e-05, -1.78734368e-04,\n",
       "        5.61576225e-04, -4.39419514e-04, -2.20472626e-04, -2.66208812e-05,\n",
       "        1.20818226e-04,  6.05075515e-05, -1.13834018e-04,  6.00973605e-04,\n",
       "       -1.88570031e-04, -1.90233440e-05, -7.14275799e-04, -1.73695818e-05,\n",
       "       -3.30828957e-04,  1.14696781e-03, -1.49788033e-05, -9.79470049e-05,\n",
       "        1.68258363e-07, -4.12729810e-05,  1.37955574e-04,  7.62324820e-07,\n",
       "        1.38711286e-03, -9.57209797e-04, -1.97363822e-04,  2.32650316e-05,\n",
       "        5.00097780e-05, -1.52049141e-04,  2.78359912e-06, -1.73037752e-05,\n",
       "       -3.77543877e-04, -6.23930118e-04,  3.11809963e-04, -2.15391029e-04,\n",
       "        2.05569022e-05,  1.01239192e-03,  8.21363330e-04, -9.50422014e-05,\n",
       "       -1.09606985e-04, -3.78259068e-05, -7.38750279e-05,  2.11344956e-05,\n",
       "        1.78442394e-04, -6.13835935e-04, -1.81070938e-05,  1.14674376e-03,\n",
       "       -5.50103937e-06, -1.32831328e-04,  4.18950647e-04,  7.75529311e-08,\n",
       "       -8.64989740e-05, -1.86014139e-04, -5.12204645e-05,  1.01808211e-05,\n",
       "        6.44609975e-04, -2.14145237e-03,  2.80443208e-04, -9.56960392e-04,\n",
       "       -5.00727153e-04,  6.45784659e-04,  2.25410374e-04,  8.82972555e-05,\n",
       "       -6.95254586e-05, -1.89049453e-04,  7.32834831e-04,  6.72846053e-05,\n",
       "        6.34508987e-05, -7.50073817e-06,  6.89676134e-05, -2.00667129e-04,\n",
       "       -1.37365989e-06, -6.08770225e-04,  1.09371763e-03,  2.37477704e-04,\n",
       "       -3.94829185e-05, -9.65567707e-05,  3.01835886e-04,  1.81365907e-05,\n",
       "       -3.07438661e-05,  8.54621386e-05,  7.62680792e-06,  5.05836832e-05,\n",
       "        2.12673520e-05,  2.36075014e-05, -9.68322047e-05,  1.29827549e-05,\n",
       "       -1.72591589e-04,  2.11834280e-04,  4.91559700e-04, -1.20994901e-05,\n",
       "       -2.46620099e-05,  5.86256112e-05, -1.74326587e-05,  1.00509816e-04,\n",
       "       -5.65942054e-04,  9.16737482e-11,  1.82954768e-06, -4.68438882e-08,\n",
       "        5.35022329e-07, -3.25833615e-05, -1.60199896e-03, -3.88576400e-04,\n",
       "        1.59150768e-03,  9.59095676e-04,  1.88200878e-04, -1.02465761e-04,\n",
       "       -1.39602614e-04,  4.54014715e-04, -1.07061674e-04,  9.19048839e-05,\n",
       "        2.54290704e-04, -4.55767462e-04,  4.14852070e-04,  1.16717279e-03,\n",
       "        4.17042729e-04,  3.72638014e-04,  1.26451848e-04, -1.19783791e-03,\n",
       "        2.88356459e-03, -4.91708081e-07, -7.48917926e-05,  6.54157071e-04,\n",
       "        2.93282506e-04, -8.91613274e-06, -3.53398008e-05, -1.03240369e-03,\n",
       "       -7.80014002e-07, -4.80812333e-05,  1.10071115e-04,  4.48959908e-05,\n",
       "        2.04958529e-04, -6.63739150e-04,  3.61709979e-06,  2.09966835e-03,\n",
       "       -7.43743738e-04, -4.15282526e-04, -7.36485152e-04, -6.31751663e-05,\n",
       "        3.58957884e-04, -7.02136532e-04,  2.94994686e-04,  3.19471682e-09,\n",
       "        8.14260803e-06,  1.24545568e-05,  8.77242517e-06, -1.86295107e-03,\n",
       "       -1.83231699e-03, -6.71215939e-04,  6.24380770e-04,  4.95198166e-04,\n",
       "        1.03563412e-04,  6.30910838e-06,  3.99834139e-05,  1.10908991e-04,\n",
       "        4.24674527e-08,  6.44814105e-05,  6.06765167e-07,  6.00726239e-06,\n",
       "       -3.13035864e-04,  1.17442672e-03,  2.56635076e-06,  1.10703040e-03,\n",
       "        5.00657420e-04,  1.58296425e-04,  4.59635962e-04, -1.73514624e-05,\n",
       "       -8.85929323e-04, -4.92490854e-04, -7.38097648e-05, -4.33896723e-10,\n",
       "       -2.80716448e-06,  5.36335397e-07,  1.00253253e-06,  4.12698599e-04,\n",
       "       -1.63096435e-04,  6.19679702e-05, -6.83553461e-04, -3.59918525e-04,\n",
       "       -3.56638776e-05,  2.11623125e-04, -4.08491089e-04, -7.36716682e-06,\n",
       "       -5.26785931e-04,  2.05980432e-04,  1.86155602e-04, -2.64275478e-04,\n",
       "        8.02481710e-05, -1.28987182e-04,  5.39028016e-04, -5.98359067e-04,\n",
       "       -7.54932794e-09, -1.56902824e-05, -1.60001498e-05, -1.08716638e-05,\n",
       "       -2.05703861e-03, -8.04216780e-04,  1.41291632e-04, -1.07739843e-03,\n",
       "       -6.85490011e-04, -9.71241745e-05, -1.61665209e-04, -3.47347447e-04,\n",
       "        6.85369537e-05, -1.90968345e-04,  1.31591810e-03,  4.65474194e-09,\n",
       "        2.01192318e-04,  1.85798780e-05, -6.47817170e-07,  1.80339047e-04,\n",
       "       -1.58551187e-05, -2.67231904e-04, -5.74491706e-04,  4.05319320e-04,\n",
       "        2.11510028e-04,  2.30499380e-12,  1.25480040e-09,  1.17874658e-08,\n",
       "        1.01286162e-08,  7.54473017e-06,  2.57677863e-05,  2.11742801e-05,\n",
       "        5.98173299e-06, -2.66077694e-06, -6.01524705e-07,  8.73676805e-05,\n",
       "       -1.06707532e-03, -5.37087456e-04, -1.39731017e-05, -3.44977272e-04,\n",
       "       -1.00401113e-04,  9.75169126e-04,  8.10385726e-04,  2.33880076e-04,\n",
       "        2.11338170e-05,  6.23134936e-07, -2.23483708e-06, -4.08206919e-05,\n",
       "        1.13549602e-08, -4.24047209e-07, -1.00091799e-05, -7.84232606e-06,\n",
       "        1.39051072e-05, -2.71631927e-04,  1.44295688e-07,  1.70305549e-05,\n",
       "       -5.34913019e-05, -1.39697742e-05,  9.34635886e-04, -3.01856409e-06,\n",
       "        1.19816299e-04,  3.96015499e-04,  8.70443059e-05,  2.27763596e-11,\n",
       "       -1.25452276e-08,  1.02307324e-07,  1.89798240e-07,  1.72601497e-05,\n",
       "        5.25190234e-05,  2.74014558e-05, -5.07303814e-05, -2.89691062e-05,\n",
       "       -6.83908884e-06,  1.44534186e-04, -1.19645950e-03, -1.41936751e-06,\n",
       "        1.59056139e-04, -2.83639428e-04, -7.90630884e-05,  2.45452309e-03,\n",
       "        6.70527307e-06, -7.37097599e-04,  1.44315907e-03,  2.91872175e-04,\n",
       "        1.15306782e-09,  6.55032113e-06, -8.68276298e-07, -5.82179185e-07,\n",
       "       -1.38859853e-04,  1.21214261e-03,  4.23731469e-04,  4.76679624e-04,\n",
       "        2.74460604e-04,  3.47337102e-05,  1.21639000e-03, -1.44482476e-05,\n",
       "        5.10405272e-04,  1.44351863e-04,  6.40702522e-04, -1.64623962e-08,\n",
       "       -2.59117671e-05,  2.46451170e-05,  1.42741247e-05,  4.18136551e-03,\n",
       "        1.15575566e-04,  1.82526111e-04,  7.55853070e-04,  8.36755791e-04,\n",
       "        1.84324922e-04, -3.12380567e-14,  4.35681572e-11, -3.14324518e-10,\n",
       "        4.57805702e-10, -3.95811682e-09, -2.57638139e-06, -1.54345948e-06,\n",
       "       -3.38738538e-06, -3.44541873e-06, -6.49062405e-07, -1.36777718e-04,\n",
       "       -3.95869141e-04, -9.39734440e-05, -1.16750157e-03, -7.00955379e-04,\n",
       "       -1.20613839e-04,  1.82037575e-04,  9.92226731e-05,  5.93436577e-07,\n",
       "       -5.29320670e-06, -1.03038190e-05,  1.06981230e-04,  1.57391448e-06,\n",
       "        8.37847833e-04,  1.31114887e-04,  8.43985360e-05, -2.07343367e-04,\n",
       "       -2.79402417e-05, -3.73604454e-03, -9.79124092e-04, -4.26485305e-04,\n",
       "        7.73351407e-09,  3.52859471e-05,  4.78021143e-06,  2.97783557e-06,\n",
       "       -7.48742454e-04,  9.19679754e-04,  3.00134758e-04,  8.54248822e-05,\n",
       "        9.86583411e-05,  3.96639109e-05, -3.40144286e-04,  1.78599005e-04,\n",
       "       -1.32154837e-03, -3.72658757e-04, -5.53567815e-04, -1.11022581e-07,\n",
       "       -3.52920876e-04, -9.20238513e-05, -3.50990842e-05,  2.10822371e-04,\n",
       "       -1.52110267e-04,  2.53230775e-04,  6.21524475e-04, -1.13445097e-04,\n",
       "       -1.65263975e-04, -3.79517482e-12, -3.55908984e-10, -2.80233897e-08,\n",
       "       -2.06839072e-08, -1.09705367e-05, -2.78743813e-05, -1.38428271e-05,\n",
       "       -1.45483661e-05, -2.69989202e-06, -2.47422343e-07,  9.01240548e-04,\n",
       "        7.26402709e-04,  2.36803433e-04, -6.14459929e-04,  1.70259544e-05,\n",
       "        8.70855012e-05, -2.56639447e-03, -2.44335607e-03, -7.77670041e-04,\n",
       "       -8.14232469e-05, -2.18554399e-04, -3.60694388e-04, -3.62143844e-04,\n",
       "       -5.48470518e-04,  1.08830098e-03,  4.03689717e-07,  1.20958911e-03,\n",
       "        4.00521441e-04,  1.44857701e-04,  4.06179650e-05,  6.87755490e-04,\n",
       "       -2.55293240e-03, -3.88631466e-04,  8.10020759e-04,  3.96138030e-04,\n",
       "        3.89779441e-11,  1.52360980e-07,  2.53403860e-07,  1.93351107e-07,\n",
       "        5.63899269e-05,  2.77305689e-04,  9.61199473e-05,  5.58286419e-05,\n",
       "        5.73222675e-05,  1.58180309e-05, -1.98588418e-03,  1.28097024e-04,\n",
       "        2.21403801e-04, -4.44947170e-04,  6.29743951e-04,  1.88177020e-04,\n",
       "       -4.68678044e-04,  3.39953011e-05,  2.41346924e-04,  5.13274510e-05,\n",
       "        2.30731775e-16,  8.92169484e-13,  1.66489047e-12,  1.58380542e-12,\n",
       "       -7.95108912e-09,  2.38371700e-08,  2.33395381e-08, -1.27555223e-09,\n",
       "        9.33976816e-10,  3.32990940e-09,  6.70352530e-07, -5.28344238e-06,\n",
       "       -1.78739008e-06,  4.33152679e-06, -8.35503287e-06, -2.04639821e-06,\n",
       "        1.37170915e-05,  2.56497513e-05,  1.18951170e-05,  1.83598597e-06,\n",
       "        1.64117399e-06,  5.08051391e-04,  1.85520721e-04,  2.09428746e-04,\n",
       "        2.15806052e-05, -2.69667924e-06,  5.54647623e-04,  1.62704515e-04,\n",
       "       -4.06925337e-05, -9.30902988e-06, -8.70956337e-03, -1.07652508e-02,\n",
       "       -4.98463766e-03, -1.01744850e-03, -7.59810469e-05])"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "coef"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('1', 5.9195481409833284e-08),\n",
       " ('住户收入中位数', -11.243025601117052),\n",
       " ('房屋使用年代中位数', -0.8488985550865555),\n",
       " ('平均房间数目', 6.4410594008838045),\n",
       " ('平均卧室数目', -31.591330845036552),\n",
       " ('街区人口', 0.000406090678218692),\n",
       " ('平均入住率', 1.003862325169533),\n",
       " ('街区的纬度', 8.705681915719548),\n",
       " ('街区的经度', 5.88063274731183),\n",
       " ('住户收入中位数^2', -0.0313081210095138),\n",
       " ('住户收入中位数 房屋使用年代中位数', 0.0018599475393608605),\n",
       " ('住户收入中位数 平均房间数目', 0.043302036387842816),\n",
       " ('住户收入中位数 平均卧室数目', -0.18614228848200431),\n",
       " ('住户收入中位数 街区人口', 5.728314010956206e-05),\n",
       " ('住户收入中位数 平均入住率', -0.002590194507419634),\n",
       " ('住户收入中位数 街区的纬度', -0.1525057186944929),\n",
       " ('住户收入中位数 街区的经度', -0.14424294470380783),\n",
       " ('房屋使用年代中位数^2', 0.00021172536249754108),\n",
       " ('房屋使用年代中位数 平均房间数目', -0.0012621898121649244),\n",
       " ('房屋使用年代中位数 平均卧室数目', 0.010611503740612697),\n",
       " ('房屋使用年代中位数 街区人口', 2.8188531228417142e-06),\n",
       " ('房屋使用年代中位数 平均入住率', -0.001817169463555658),\n",
       " ('房屋使用年代中位数 街区的纬度', -0.010069037408713212),\n",
       " ('房屋使用年代中位数 街区的经度', -0.00999950183371761),\n",
       " ('平均房间数目^2', 0.0072694776784208315),\n",
       " ('平均房间数目 平均卧室数目', -0.06890643779325112),\n",
       " ('平均房间数目 街区人口', -6.823655905927973e-05),\n",
       " ('平均房间数目 平均入住率', 0.026887883869342384),\n",
       " ('平均房间数目 街区的纬度', 0.08750899544328677),\n",
       " ('平均房间数目 街区的经度', 0.08228904004428692),\n",
       " ('平均卧室数目^2', 0.16018095673076294),\n",
       " ('平均卧室数目 街区人口', 0.0005142639998074091),\n",
       " ('平均卧室数目 平均入住率', -0.08719113737712174),\n",
       " ('平均卧室数目 街区的纬度', -0.4370430370283017),\n",
       " ('平均卧室数目 街区的经度', -0.4041506119083022),\n",
       " ('街区人口^2', 2.7377915550354326e-09),\n",
       " ('街区人口 平均入住率', 1.9142675218200485e-05),\n",
       " ('街区人口 街区的纬度', 2.2952983073875922e-05),\n",
       " ('街区人口 街区的经度', 1.4656775674481048e-05),\n",
       " ('平均入住率^2', 8.7156103435594e-05),\n",
       " ('平均入住率 街区的纬度', 0.021334459219946734),\n",
       " ('平均入住率 街区的经度', 0.016241293818042908),\n",
       " ('街区的纬度^2', 0.06188673574125679),\n",
       " ('街区的纬度 街区的经度', 0.10810717328653006),\n",
       " ('街区的经度^2', 0.03990773509638848)]"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[*zip(poly.get_feature_names(X.columns),reg.coef_)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [],
   "source": [
    "#放到dataframe中进行排序\n",
    "coeff = pd.DataFrame([poly.get_feature_names(X.columns),reg.coef_.tolist()]).T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0.000310808</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>住户收入中位数</td>\n",
       "      <td>-2.29593e-05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>房屋使用年代中位数</td>\n",
       "      <td>-1.86556e-07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>平均房间数目</td>\n",
       "      <td>3.14541e-09</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>平均卧室数目</td>\n",
       "      <td>-1.00201e-07</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           0            1\n",
       "0          1  0.000310808\n",
       "1    住户收入中位数 -2.29593e-05\n",
       "2  房屋使用年代中位数 -1.86556e-07\n",
       "3     平均房间数目  3.14541e-09\n",
       "4     平均卧室数目 -1.00201e-07"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "coeff.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [],
   "source": [
    "coeff.columns = [\"feature\",\"coef\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feature</th>\n",
       "      <th>coef</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>491</th>\n",
       "      <td>街区的纬度^3 街区的经度</td>\n",
       "      <td>-0.0107653</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>490</th>\n",
       "      <td>街区的纬度^4</td>\n",
       "      <td>-0.00870956</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>492</th>\n",
       "      <td>街区的纬度^2 街区的经度^2</td>\n",
       "      <td>-0.00498464</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>377</th>\n",
       "      <td>平均房间数目^2 平均卧室数目 平均入住率</td>\n",
       "      <td>-0.00373604</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>421</th>\n",
       "      <td>平均房间数目 街区的纬度^3</td>\n",
       "      <td>-0.00256639</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>436</th>\n",
       "      <td>平均卧室数目^2 平均入住率 街区的经度</td>\n",
       "      <td>-0.00255293</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>422</th>\n",
       "      <td>平均房间数目 街区的纬度^2 街区的经度</td>\n",
       "      <td>-0.00244336</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>105</th>\n",
       "      <td>房屋使用年代中位数 平均入住率 街区的经度</td>\n",
       "      <td>-0.00214145</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>244</th>\n",
       "      <td>住户收入中位数 平均房间数目 平均入住率^2</td>\n",
       "      <td>-0.00205704</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>450</th>\n",
       "      <td>平均卧室数目 平均入住率^3</td>\n",
       "      <td>-0.00198588</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>195</th>\n",
       "      <td>住户收入中位数^2 平均入住率^2</td>\n",
       "      <td>-0.00186295</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>196</th>\n",
       "      <td>住户收入中位数^2 平均入住率 街区的纬度</td>\n",
       "      <td>-0.00183232</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>150</th>\n",
       "      <td>街区人口 平均入住率 街区的纬度</td>\n",
       "      <td>-0.001602</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>392</th>\n",
       "      <td>平均房间数目 平均卧室数目^2 平均入住率</td>\n",
       "      <td>-0.00132155</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>167</th>\n",
       "      <td>住户收入中位数^3 平均房间数目</td>\n",
       "      <td>-0.00119784</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>314</th>\n",
       "      <td>房屋使用年代中位数 平均房间数目^2 平均卧室数目</td>\n",
       "      <td>-0.00119646</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>362</th>\n",
       "      <td>房屋使用年代中位数 平均入住率 街区的纬度^2</td>\n",
       "      <td>-0.0011675</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>247</th>\n",
       "      <td>住户收入中位数 平均房间数目 街区的纬度^2</td>\n",
       "      <td>-0.0010774</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>276</th>\n",
       "      <td>住户收入中位数 平均入住率^2 街区的纬度</td>\n",
       "      <td>-0.00106708</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>175</th>\n",
       "      <td>住户收入中位数^2 房屋使用年代中位数 平均卧室数目</td>\n",
       "      <td>-0.0010324</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>493</th>\n",
       "      <td>街区的纬度 街区的经度^3</td>\n",
       "      <td>-0.00101745</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>378</th>\n",
       "      <td>平均房间数目^2 平均卧室数目 街区的纬度</td>\n",
       "      <td>-0.000979124</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>73</th>\n",
       "      <td>住户收入中位数 街区人口 街区的纬度</td>\n",
       "      <td>-0.00095721</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>107</th>\n",
       "      <td>房屋使用年代中位数 街区的纬度 街区的经度</td>\n",
       "      <td>-0.00095696</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>216</th>\n",
       "      <td>住户收入中位数 房屋使用年代中位数 平均卧室数目 平均入住率</td>\n",
       "      <td>-0.000885929</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>245</th>\n",
       "      <td>住户收入中位数 平均房间数目 平均入住率 街区的纬度</td>\n",
       "      <td>-0.000804217</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>423</th>\n",
       "      <td>平均房间数目 街区的纬度 街区的经度^2</td>\n",
       "      <td>-0.00077767</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>房屋使用年代中位数 街区人口</td>\n",
       "      <td>-0.000758175</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>384</th>\n",
       "      <td>平均房间数目^2 平均入住率^2</td>\n",
       "      <td>-0.000748742</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>184</th>\n",
       "      <td>住户收入中位数^2 平均房间数目 街区的纬度</td>\n",
       "      <td>-0.000743744</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>438</th>\n",
       "      <td>平均卧室数目^2 街区的纬度 街区的经度</td>\n",
       "      <td>0.000810021</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>282</th>\n",
       "      <td>住户收入中位数 街区的纬度^2 街区的经度</td>\n",
       "      <td>0.000810386</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>86</th>\n",
       "      <td>房屋使用年代中位数^2 街区的纬度</td>\n",
       "      <td>0.000821363</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>347</th>\n",
       "      <td>房屋使用年代中位数 平均卧室数目 街区的纬度 街区的经度</td>\n",
       "      <td>0.000836756</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>372</th>\n",
       "      <td>平均房间数目^3 平均入住率</td>\n",
       "      <td>0.000837848</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>415</th>\n",
       "      <td>平均房间数目 平均入住率^3</td>\n",
       "      <td>0.000901241</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>385</th>\n",
       "      <td>平均房间数目^2 平均入住率 街区的纬度</td>\n",
       "      <td>0.00091968</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>298</th>\n",
       "      <td>房屋使用年代中位数^2 平均卧室数目^2</td>\n",
       "      <td>0.000934636</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>153</th>\n",
       "      <td>街区人口 街区的纬度 街区的经度</td>\n",
       "      <td>0.000959096</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>281</th>\n",
       "      <td>住户收入中位数 街区的纬度^3</td>\n",
       "      <td>0.000975169</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>85</th>\n",
       "      <td>房屋使用年代中位数^2 平均入住率</td>\n",
       "      <td>0.00101239</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>429</th>\n",
       "      <td>平均卧室数目^3 街区的经度</td>\n",
       "      <td>0.0010883</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>122</th>\n",
       "      <td>平均房间数目 街区人口 街区的纬度</td>\n",
       "      <td>0.00109372</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>211</th>\n",
       "      <td>住户收入中位数 房屋使用年代中位数 平均房间数目 平均入住率</td>\n",
       "      <td>0.00110703</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>95</th>\n",
       "      <td>房屋使用年代中位数 平均卧室数目 街区人口</td>\n",
       "      <td>0.00114674</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>65</th>\n",
       "      <td>住户收入中位数 平均房间数目 街区的经度</td>\n",
       "      <td>0.00114697</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>163</th>\n",
       "      <td>街区的纬度 街区的经度^2</td>\n",
       "      <td>0.00116717</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>209</th>\n",
       "      <td>住户收入中位数 房屋使用年代中位数 平均房间数目 平均卧室数目</td>\n",
       "      <td>0.00117443</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>431</th>\n",
       "      <td>平均卧室数目^2 街区人口 平均入住率</td>\n",
       "      <td>0.00120959</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>329</th>\n",
       "      <td>房屋使用年代中位数 平均房间数目 平均入住率 街区的纬度</td>\n",
       "      <td>0.00121214</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>334</th>\n",
       "      <td>房屋使用年代中位数 平均卧室数目^3</td>\n",
       "      <td>0.00121639</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>254</th>\n",
       "      <td>住户收入中位数 平均卧室数目^2 街区的经度</td>\n",
       "      <td>0.00131592</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>72</th>\n",
       "      <td>住户收入中位数 街区人口 平均入住率</td>\n",
       "      <td>0.00138711</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>322</th>\n",
       "      <td>房屋使用年代中位数 平均房间数目 平均卧室数目 街区的纬度</td>\n",
       "      <td>0.00144316</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>152</th>\n",
       "      <td>街区人口 街区的纬度^2</td>\n",
       "      <td>0.00159151</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38</th>\n",
       "      <td>街区人口 街区的经度</td>\n",
       "      <td>0.00208526</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>183</th>\n",
       "      <td>住户收入中位数^2 平均房间数目 平均入住率</td>\n",
       "      <td>0.00209967</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>319</th>\n",
       "      <td>房屋使用年代中位数 平均房间数目 平均卧室数目^2</td>\n",
       "      <td>0.00245452</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>168</th>\n",
       "      <td>住户收入中位数^3 平均卧室数目</td>\n",
       "      <td>0.00288356</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>343</th>\n",
       "      <td>房屋使用年代中位数 平均卧室数目 平均入住率^2</td>\n",
       "      <td>0.00418137</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>495 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                             feature         coef\n",
       "491                    街区的纬度^3 街区的经度   -0.0107653\n",
       "490                          街区的纬度^4  -0.00870956\n",
       "492                  街区的纬度^2 街区的经度^2  -0.00498464\n",
       "377            平均房间数目^2 平均卧室数目 平均入住率  -0.00373604\n",
       "421                   平均房间数目 街区的纬度^3  -0.00256639\n",
       "436             平均卧室数目^2 平均入住率 街区的经度  -0.00255293\n",
       "422             平均房间数目 街区的纬度^2 街区的经度  -0.00244336\n",
       "105            房屋使用年代中位数 平均入住率 街区的经度  -0.00214145\n",
       "244           住户收入中位数 平均房间数目 平均入住率^2  -0.00205704\n",
       "450                   平均卧室数目 平均入住率^3  -0.00198588\n",
       "195                住户收入中位数^2 平均入住率^2  -0.00186295\n",
       "196            住户收入中位数^2 平均入住率 街区的纬度  -0.00183232\n",
       "150                 街区人口 平均入住率 街区的纬度    -0.001602\n",
       "392            平均房间数目 平均卧室数目^2 平均入住率  -0.00132155\n",
       "167                 住户收入中位数^3 平均房间数目  -0.00119784\n",
       "314        房屋使用年代中位数 平均房间数目^2 平均卧室数目  -0.00119646\n",
       "362          房屋使用年代中位数 平均入住率 街区的纬度^2   -0.0011675\n",
       "247           住户收入中位数 平均房间数目 街区的纬度^2   -0.0010774\n",
       "276            住户收入中位数 平均入住率^2 街区的纬度  -0.00106708\n",
       "175       住户收入中位数^2 房屋使用年代中位数 平均卧室数目   -0.0010324\n",
       "493                    街区的纬度 街区的经度^3  -0.00101745\n",
       "378            平均房间数目^2 平均卧室数目 街区的纬度 -0.000979124\n",
       "73                住户收入中位数 街区人口 街区的纬度  -0.00095721\n",
       "107            房屋使用年代中位数 街区的纬度 街区的经度  -0.00095696\n",
       "216   住户收入中位数 房屋使用年代中位数 平均卧室数目 平均入住率 -0.000885929\n",
       "245       住户收入中位数 平均房间数目 平均入住率 街区的纬度 -0.000804217\n",
       "423             平均房间数目 街区的纬度 街区的经度^2  -0.00077767\n",
       "20                    房屋使用年代中位数 街区人口 -0.000758175\n",
       "384                 平均房间数目^2 平均入住率^2 -0.000748742\n",
       "184           住户收入中位数^2 平均房间数目 街区的纬度 -0.000743744\n",
       "..                               ...          ...\n",
       "438             平均卧室数目^2 街区的纬度 街区的经度  0.000810021\n",
       "282            住户收入中位数 街区的纬度^2 街区的经度  0.000810386\n",
       "86                 房屋使用年代中位数^2 街区的纬度  0.000821363\n",
       "347     房屋使用年代中位数 平均卧室数目 街区的纬度 街区的经度  0.000836756\n",
       "372                   平均房间数目^3 平均入住率  0.000837848\n",
       "415                   平均房间数目 平均入住率^3  0.000901241\n",
       "385             平均房间数目^2 平均入住率 街区的纬度   0.00091968\n",
       "298             房屋使用年代中位数^2 平均卧室数目^2  0.000934636\n",
       "153                 街区人口 街区的纬度 街区的经度  0.000959096\n",
       "281                  住户收入中位数 街区的纬度^3  0.000975169\n",
       "85                 房屋使用年代中位数^2 平均入住率   0.00101239\n",
       "429                   平均卧室数目^3 街区的经度    0.0010883\n",
       "122                平均房间数目 街区人口 街区的纬度   0.00109372\n",
       "211   住户收入中位数 房屋使用年代中位数 平均房间数目 平均入住率   0.00110703\n",
       "95             房屋使用年代中位数 平均卧室数目 街区人口   0.00114674\n",
       "65              住户收入中位数 平均房间数目 街区的经度   0.00114697\n",
       "163                    街区的纬度 街区的经度^2   0.00116717\n",
       "209  住户收入中位数 房屋使用年代中位数 平均房间数目 平均卧室数目   0.00117443\n",
       "431              平均卧室数目^2 街区人口 平均入住率   0.00120959\n",
       "329     房屋使用年代中位数 平均房间数目 平均入住率 街区的纬度   0.00121214\n",
       "334               房屋使用年代中位数 平均卧室数目^3   0.00121639\n",
       "254           住户收入中位数 平均卧室数目^2 街区的经度   0.00131592\n",
       "72                住户收入中位数 街区人口 平均入住率   0.00138711\n",
       "322    房屋使用年代中位数 平均房间数目 平均卧室数目 街区的纬度   0.00144316\n",
       "152                     街区人口 街区的纬度^2   0.00159151\n",
       "38                        街区人口 街区的经度   0.00208526\n",
       "183           住户收入中位数^2 平均房间数目 平均入住率   0.00209967\n",
       "319        房屋使用年代中位数 平均房间数目 平均卧室数目^2   0.00245452\n",
       "168                 住户收入中位数^3 平均卧室数目   0.00288356\n",
       "343         房屋使用年代中位数 平均卧室数目 平均入住率^2   0.00418137\n",
       "\n",
       "[495 rows x 2 columns]"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "coeff.sort_values(by=\"coef\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [],
   "source": [
    "#顺便可以查看一下多项式变化之后，模型的拟合效果如何了\n",
    "poly = PolynomialFeatures(degree=4).fit(X,y)\n",
    "X_ = poly.transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6062326851998051"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reg = LinearRegression().fit(X,y)\n",
    "reg.score(X,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "R2:0.7450320303671267\n",
      "time:1.1120293140411377\n"
     ]
    }
   ],
   "source": [
    "from time import time\n",
    "time0 = time()\n",
    "reg_ = LinearRegression().fit(X_,y)\n",
    "print(\"R2:{}\".format(reg_.score(X_,y)))\n",
    "print(\"time:{}\".format(time()-time0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "R2:0.9742884451820468\n",
      "time:15.500584602355957\n"
     ]
    }
   ],
   "source": [
    "#假设使用其他模型？\n",
    "from sklearn.ensemble import RandomForestRegressor as RFR\n",
    "\n",
    "time0 = time()\n",
    "print(\"R2:{}\".format(RFR(n_estimators=100).fit(X,y).score(X,y)))\n",
    "print(\"time:{}\".format(time()-time0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
